【问题标题】:StreamBuilder not updating Firestore data in FlutterStreamBuilder 不更新 Flutter 中的 Firestore 数据
【发布时间】:2022-11-17 01:43:25
【问题描述】:

我正在制作一个 Flutter 应用程序,并试图在应用程序中获取用户数据。

所以基本上,用户使用他的信息(姓名、电子邮件、密码)注册,当他登录时,这些数据显示在 ProfilePage 中。

根据 Firestore 文档,我应该使用 StreamBuilder 来获取他的数据。

此时,一切正常。

问题是,当用户注销并且另一个用户登录时,ProfilePage 显示先前用户的数据(用户已注销)。

只有当我重新启动应用程序时,我才能获得正确的数据。

这是我的ProfilePage

class UserInformation extends StatefulWidget {
  @override
  _UserInformationState createState() => _UserInformationState();
}

class _UserInformationState extends State<UserInformation> {

  final _uid = FirebaseAuth.instance.currentUser!.uid;

  final Stream<QuerySnapshot> _usersStream =
      FirebaseFirestore.instance.collection('Users')
        .doc(_uid)
        .collection('UserData')
        .snapshots();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
       key: Key(_uid),
      stream: _usersStream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) {
          return const Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Text("Loading");
        }

        return ListView(
          children: snapshot.data!.docs
              .map((DocumentSnapshot document) {
                Map<String, dynamic> data =
                    document.data()! as Map<String, dynamic>;
                return ListTile(
                  title: Text(data['full_name']),
                  subtitle: Text(data['company']),
                );
              })
              .toList()
              .cast(),
        );
      },
    );
  }
}

我看到这是一个在 SO 上被问过多次的问题,但我找不到好的解决方案。我试图在 StreamBuilder 中添加一个唯一键,但它并没有解决问题。

我也看到了didUpdateWidget的用法,但是我不明白怎么用。

【问题讨论】:

    标签: flutter dart google-cloud-firestore flutter-streambuilder


    【解决方案1】:

    尝试替换这个:

      final _uid = FirebaseAuth.instance.currentUser!.uid;
    

    有了这个:

      late final _uid;
      @override
      initState() {
      _uid = FirebaseAuth.instance.currentUser!.uid;
      super.initState();
     }
    

    然后重新启动您的应用程序,并模拟您的行为

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 2021-10-09
      • 2020-07-02
      • 2020-11-03
      • 2019-08-19
      • 2020-10-15
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多