使用 StreamProvider 和 StreamBuilder 时出错

Posted

技术标签:

【中文标题】使用 StreamProvider 和 StreamBuilder 时出错【英文标题】:Error when using StreamProvider and StreamBuilder 【发布时间】:2020-01-15 10:42:43 【问题描述】:

我正在尝试使用 StreamProvider 和 StreamBuilder 通过以下代码将数据从 firestore 提取到我的应用程序中。我收到错误“未定义流用户和“用户列表”以及“测试用户”不是类型。这是我的 Firestore 数据库的图片firestore setup]1

有谁知道我该如何解决这个问题,以便它从 Firestore 中提取数据并在添加新用户时动态更新?

Main.dart:

class _MyHomePageState extends State<MyHomePage> 
  final auth = FirebaseAuth.instance;
  final db = DatabaseService();

  @override
  Widget build(BuildContext context) 

    var user = Provider.of<FirebaseUser>(context);
    bool loggedIn = user != null;

    final _width = MediaQuery.of(context).size.width;
    final _height = MediaQuery.of(context).size.height;

    StreamProvider<List<User>>.value(
      value: db.streamUsers(user),
      child: UsersList(),
    ),

    StreamBuilder<TestUser>(
      stream: db.streamTestUser(user.uid),
        builder: (context, snapshot) 
        var user = snapshot.data;

        if (user != null) 
            return Stack(...

我也有我的 db.dart 文件:

class DatabaseService 
  final Firestore _db = Firestore.instance;

  Future<User> getUser(String id) async 
    var snap = await _db.collection('users').document(id).get();

    return User.fromMap(snap.data);
  

    Stream<User> streamTestUser(String id) 
      return _db
          .collection('users')
          .document(id)
          .snapshots()
          .map((snap) => User.fromMap(snap.data));
    


最后是我的 user_model.dart 文件:

class User 

  final String name;
  final String photourl;
  final int totalquestions;

  User(this.name, this.photourl, this.totalquestions);

  factory User.fromMap(Map data) 
    return User(
      name: data['name'] ?? '',
      photourl: data['photourl'] ?? '',
      totalquestions: data['totalquestions'] ?? '',
    );
  

【问题讨论】:

我在 DatabaseService 中找不到方法流用户(用户) Adn 你没有 testuser 的模型,这就是为什么它说“testuser”不是类型。你的函数应该是 StreamBuilder( stream: db.streamTestUser(user.uid), builder: (context, snapshot) var user = snapshot.data; if (user != null) return Stack(... @Mohamedhassankadri 谢谢,但这仍然给我错误:错误:参数类型'Stream不能分配给参数类型'Stream(argument_type_not_assignable at [ flutter_appprofilescreenv1] lib/main.dart:91) 【参考方案1】:

尝试在StreamProvider 中使用Builder 而不是StreamBuilder。 我正在使用这种方法。

class MyHomePage extends StatelessWidget 
@override
Widget build(BuildContext context) 
  var user = Provider.of<FirebaseUser>(context);

  return StreamProvider<User>.value(
    value: db.getUser(user?.uid),
    catchError: (_, __) => null,
    child: Builder(
      builder: (context) 
        ///Passing UserData Down the Builder
        var _userSnapshot = Provider.of<UserData>(context);

        ///Check UserData Availability
        if (_userSnapshot == null) 
          return Center(
            child: Text('User Empty'),
          );
         else 
          return Scaffold(
            body: Column(
              children: <Widget>[
                Text(_userSnapshot?.name),
                Text(_userSnapshot?.photourl),
                Text(_userSnapshot?.totalquestions),
              ],
            ),
          );
        
      ,
    ),
  );

【讨论】:

以上是关于使用 StreamProvider 和 StreamBuilder 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Riverpod:使用 StreamProvider 返回 2 个流

如何使用 StreamProvider 检查 Firestore 快照流的 ConnectionState?

Riverpod:是不是有在另一个 StreamProvider 中读取 StreamProvider 的正确方法?

StreamProvider 不更新状态

Flutter:StreamProvider 的奇怪行为,使用不完整数据重建的小部件

Flutter - StreamProvider - 向 Firebase 发送重复出现的 XHR 请求