首页 > 解决方案 > 从登录用户 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 的值不可用有关(未来或等待/异步相关)。如果我弄明白了,我一定会在这里发帖。再次感谢您花时间查看。

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


最终改用 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;
    }
  }

推荐阅读