使用 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尝试在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 的正确方法?