- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我收听Cloud Firestore中用户文档中的更改。
我通过获取当前用户ID,然后获取与该ID相关联的文档来完成此操作。
class UserService {
...
//GET A USER'S INFORMATION AS A STREAM
// ? IF NO UID IS PASSED, IT GETS THE INFO OF THE CURRENT USER
Stream<User> getUserInfoAsStream({String uid}) async* {
if (uid == null) {
uid = await AuthService().getUID();
}
yield* Firestore.instance
.collection('users')
.document(uid)
.snapshots()
.map((doc) => User.fromFirestore(doc));
}
...
然后,我使用
StreamProvider
收听我的
main.dart
中的流
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<User>.value(
value: UserService().getUserInfoAsStream(),
),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
home: SplashScreen(),
),
);
}
}
在应用程序的生命周期中,它可以正常运行,但是当用户使用
FirebaseAuth.instance.signOut();
退出然后以其他用户身份登录时,流保持不变(即,它侦听旧的
uid流),而StreamProvider则不不要听新的数据流。
// ? SIGN OUT CODE: If user signed out, it returns true, else, false
Future<bool> signOut() async {
try {
await _firebaseAuth.signOut();
return true;
} catch (error) {
print(error);
return false;
}
}
| 在哪里使用 |FlatButton(
onPressed: () {
AuthService().signOut().then((value) =>
Navigator.of(context).pushAndRemoveUntil(
CupertinoPageRoute(
builder: (BuildContext context) {
return Onboarding();
}), (route) => false));
},
child: Text("Yes")),
为了解决该问题,我将把当前的uid传递给StreamProvider,但是我只能异步获取当前的uid。最佳答案
我设法从provider
包切换到get_it
来解决此问题。get_it
允许您注册和注销单例,这意味着当用户登录时,我可以注册单例,以便可以在依赖它的所有屏幕上使用它。然后,当我注销时,我只是注销了它。这样,用户始终在登录和注销后进行更新。
这是您自己的操作方法。
在pubspec.yaml中安装get_it
软件包。
get_it: ^4.0.2
在您的
main.dart
旁边创建一个名为
locator.dart
的新文件。在其中添加以下代码:
GetIt locator = GetIt.instance;
void setupLocator() {
// Replace this with the object you're trying to listen to.
User user;
Stream<User> userStream = UserService().getUserInfoAsStream();
userStream.listen((event) => user = event);
locator.registerLazySingleton(() => user); // Register your object
}
登录时,只需调用
setupLocator();
,然后注销即可,请使用以下代码:
locator.unregister<User>();
这就是我要做的所有工作!
UserProvider
Singleton使其变得更好,更轻巧,该监听器侦听身份验证中的更改,然后在用户登录时获取当前用户。
import 'package:planster/models/core/user.dart';
import 'package:planster/models/services/auth_service.dart';
import 'package:planster/models/services/user_service.dart';
class UserProvider {
// SINGLETON INITIALIZATION
static final UserProvider _singleton = UserProvider._internal();
factory UserProvider.instance() {
return _singleton;
}
UserProvider._internal() {
listenToUserAuthState();
}
// VARIABLES
User user;
void listenToUserAuthState() async {
AuthService().onAuthStateChanged.listen((event) {
uid = event.uid;
if (uid != null)
UserService().getUserInfoAsStream(uid: uid).listen((userEvent) {
user = userEvent;
});
});
}
}
关于firebase - 用户更改时,StreamProvider监听用户的消息不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62932908/
我正在使用 Google Cloud Firestore 作为 Flutter 应用程序的后端。目前我正在使用 StreamProvider 从云 firestore 构建数据流。现在,我需要维护 2
我正在尝试使用 StreamProvider(来自 this awesome package),但我一直在努力让特定的流工作。 我创建了一个 StreamController,我用它通过它的 Sink
我从 StreamProvider 获取的数据不完整。 下一个最小的小部件树重现了我的问题:选项卡式屏幕上的 SreamProvider。 我的用户对象包含多个值(以及其他属性)的映射,我通过调用 f
目前,我们正在使用 Firebase 在我们的应用程序上实现简单的聊天。 我们使用 Riverpod 处理应用程序的启动和身份验证。 启动过程如下: @override Widget build(
我想知道是否有人可以告诉我如何实现 Flutter StreamProvider“catchError”属性? 下面的示例代码添加到: StreamProvider.value( initia
我是 flutter 的新手。我实现了这个示例应用程序以了解 SQLite 和提供程序状态管理。这是一个简单的任务管理系统。我使用 MOOR 来处理 SQLite 数据库。我遇到的问题是任务列表在添加
我使用 StreamProvider将图像提供给其他应用程序。一切正常,但有一种情况除外:当我尝试将多张图像共享到我的三星 S6 设备(Android 5.1.1)上的消息传递应用程序时,消息传递应用
StreamProvider.value 使用相同的值多次构建小部件。 StreamProvider.value( value: FirebaseAuth.instance.onAuthS
我有一个像这样的 StreamBuilder: StreamBuilder>( stream: myDatabase.authInfosDao.watch(),
我正在 Flutter 中开发一个应用程序(我还是个新手),但遇到以下错误: Error: Could not find the correct Provider> above this Exerci
我有两个流: Stream FirebaseAuth.instance.onAuthStateChanged Stream userService.streamUser(String uid) 我的
当我尝试在 firestore 中获取不存在的数据时,我遇到了 StreamProvider 的问题。 Stream streamCollectedItem(String id,int categor
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示: class MyApp extends StatelessWidget
我正在使用 Flutter 开发一个应用程序,我正在使用 Cloud Firestore。是否有任何理由更喜欢 StreamBuilder 之间的一个和 StreamProvider ? 最佳答案 有
我正在尝试设置一个个人资料类型页面,用户可以在其中查看他们的信息,最终我将添加功能,以便他们可以更改他们的数据。我正在使用 Provider 访问 Firebase 流 它返回当前用户的 UID(这工
我试图通过将简单的 FireStore auth Provider 示例迁移到 RiverPod 来了解 RiverPod。 这是我的身份验证服务: import 'package:firebase_
有时我想我得到了提供者的逻辑,然后我被难住了几个小时试图做下面的事情。 我需要从 Firestore 集合流中获取连接 ID 列表。简单。 但是,我需要将此连接 ID 的流列表提供给另一个 fires
我注意到自从我使用 StreamProvider 添加一个新的 Stream 以来,我的读取请求显着增加。 ,我设法通过删除流和没有重复请求来确认这一点。但我似乎无法追查为什么它重复。 注意:代码运行
我正在尝试根据 Firebase 的身份验证状态创建一个简单的导航,但出于某种原因Provider.of(context)始终返回 null 作为小部件构建方法中的第一个值。所以我的应用程序总是导航到
我是一名优秀的程序员,十分优秀!