使用StreamProvider和StreamBuilder时出错

时间:2019-09-13 14:32:03

标签: flutter google-cloud-firestore flutter-provider

我正在尝试使用StreamProvider和StreamBuilder通过以下代码将数据从Firestore提取到我的应用程序中。我收到错误消息“未定义streamusers和“ userslist”以及“ testuser”不是类型。这是我的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'] ?? '',
    );
  }
}

1 个答案:

答案 0 :(得分:2)

尝试在Builder内而不是StreamProvider内使用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),
              ],
            ),
          );
        }
      },
    ),
  );
}