firebase - 从登录用户 Flutter/Firebase 获取文档列表
问题描述
我对颤振/Firebase 有点陌生,我正在尝试从登录用户集合的子集合中获取文档列表。目前,我使用代码为流中的登录用户打印语句返回 null ,但是如果我手动传入用户 ID(而不是传递uid
)它可以工作。
数据库.dart
class DatabaseService {
final String uid;
DatabaseService({this.uid});
// list from snapshot
List<Item> _ListFromSnapshot(QuerySnapshot snapshot) {
print(snapshot.documents);
return snapshot.documents.map((doc) {
return Item(
name: doc.data['name'] ?? '',
);
}).toList();
}
Stream<List<Item>> get items {
print('current logged in user $uid');
return Firestore.instance
.collection('users')
.document(uid)
.collection('items')
.snapshots()
.map(_ListFromSnapshot);
}
}
主页.dart
class Home extends StatelessWidget {
final AuthService _auth = AuthService();
@override
Widget build(BuildContext context) {
return StreamProvider<List<Item>>.value(
value: DatabaseService().items,
child: Scaffold(
backgroundColor: Colors.brown[50],
appBar: AppBar(
title: Text('MyApp'),
),
// just a widget that uses a listview builder to make a card for each item.
body: ItemList(),
),
);
}
}
认证飞镖
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
// create user obj based on FirebaseUser
User _userFromFirebaseUser(FirebaseUser user) {
return user != null ? User(uid: user.uid) : null;
}
// auth change user stream
Stream<User> get user {
return _auth.onAuthStateChanged
.map(_userFromFirebaseUser);
}
}
我有一种感觉,这与应用程序调用它时 uid 的值不可用有关(未来或等待/异步相关)。如果我弄明白了,我一定会在这里发帖。再次感谢您花时间查看。
解决方案
最终改用 FutureBuilder 并能够创建如下函数:
Future<List<T>> getDocs() async {
final Firestore _db = Firestore.instance;
FirebaseUser user = await _auth.currentUser();
if (user != null) {
ref = _db.collection('users/${user.uid}/items');
} else {
return null;
}
}
推荐阅读
- r - 考克斯模型森林图
- c# - 滚动到底部时,ListView 会自动添加更多内容
- huawei-mobile-services - IAP 回调地址
- r - devtools::check() - 没有名为“Matrix”的包
- flutter - ListView.builder 到达列表末尾并向后滚动后返回起始位置
- python - 补丁是否可以在 SemVer 中包含添加内容?
- c++ - wxTimer 与 Bind() 绑定后未调用回调
- arrays - Ruby:比较两个数组数组的有效方法
- firebase - 未处理的异常:[firebase_storage/object-not-found] 所需参考处不存在对象
- debugging - 如何找出最初创建淘汰赛 observable 的位置(在哪个 .js 文件中)?