如何在没有 StreamBuilder 的情况下从 Firestore 检索实时日期

泷诺

要处理 Firestore 上的实时更改,我们应该按照以下页面使用 StreamBuilder。https://firebase.flutter.dev/docs/firestore/usage/#realtime-changes但是,我想在没有 StreamBuilder 的情况下进行交易(换句话说,“没有 Widget”)。

以下代码是我试过的。

大多数情况下,没有问题。但是,来自流/快照的第一个数据很少不存在 (docSnapshot.exists == false ),即使 Firestore 中存在 userProfile。

我认为原因是因为 docSnapshot 仍未连接到 Firestore。我知道我们可以使用 connectionState 属性来检查连接状态,但是要使用 connectionState,我们应该使用 StreamBuilder(AsyncSnapshot)...

class Wrapper extends StatefulWidget {
  @override
  _WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {
    @override
  Widget build(BuildContext context) {
        return MultiProvider(
      providers: [
        StreamProvider<UserProfile>.value(
            value: DatabaseService(user: _user).userProfile),
      ],
      child: _buildMyApp(),
    );
    }

    Widget _buildMyApp() {
    return Builder(
        builder: (context) {
          /// UserProfile
        final _userProfile = Provider.of<UserProfile>(context);
        if (_userProfile == null) return CreateUserProfile();
                return MaterialApp(title:'MyApp', home:MyApp());
            }
        );
    }
}

class DatabaseService {
  final User user;
  DocumentReference userRef;

  DatabaseService({this.user}) {
        /// get UserProfile data
    userRef = FirebaseFirestore.instance.collection('users').doc(user.uid);
  }

    Stream<UserProfile> get userProfile {
    try {
            /// map snapshot to UserProfile ojb AND 
      return userRef
          .snapshots()
          .map((docSnapshot) => _userProfileFromFirestore(docSnapshot));
    } catch (e) {
      print('[get userProfile]ERROR: ${e.toString()}');
      return null;
    }
  }

    //create UserProfile obj 
  UserProfile _userProfileFromFirestore(DocumentSnapshot docSnapshot) {
    if (docSnapshot.exists) {
      return UserProfile(
        name: docSnapshot.data()['name'],
        birthday: docSnapshot.data()['birthday']
      );
    } else {
      return null;
    }
  }
}
舒克特杰尔

Firestore 文档有一个metadata包含布尔isFromCache属性您可以使用它来过滤您的流,如下所示:

FirebaseFirestore.instance
    .collection('users')
    .doc('aaa')
    .snapshots()
    .where((doc) => !doc.metadata.isFromCache);

在你的情况下,它会像

Stream<UserProfile> get userProfile {
    try {
            /// map snapshot to UserProfile ojb AND 
      return userRef
          .snapshots()
          .where((docSnapshot) => !docSnapshot.metadata.isFromCache)
          .map((docSnapshot) => _userProfileFromFirestore(docSnapshot));
    } catch (e) {
      print('[get userProfile]ERROR: ${e.toString()}');
      return null;
    }
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有streambuilder的情况下获取firebase数据

如何在没有秒的情况下从数据库中检索日期

如何在设备中没有连接的情况下获取 DocumentSnapshot 和 firestore in flutter?

Firebase 函数如何在没有管理员权限的情况下访问 Firestore

没有实时CD的情况下如何还原GRUB?

如何在没有DnsServer模块的情况下使用PowerShell检索所有DNS记录?

如何在没有jQuery的情况下实时获取scrollTop位置?

如何在没有实时 USB/CD 的情况下修改分区

如何在没有任何模块的情况下将日历日期转换为顺序日期

如何在没有子查询或嵌套查询的情况下检索数据

如何在没有辅助功能模板的情况下检索可变参数模板参数?

如何在没有EventListener的情况下从Firebase检索数据?

如何在没有侦听器的情况下从Firebase数据库检索数据?

如何在C中没有指针的情况下检索超出范围的静态值?

如何在没有ParseException的情况下使用SimpleDateFormat测试解析日期

如何在没有时区偏移的情况下将日期转换为毫秒?

如何在没有时间的情况下获取当前日期?

如何在没有误解的情况下将日期存储在 Spark 数据集中

没有区域设置类的情况下,如何在Django中获取区域设置日期?

我如何在没有日期和年份的情况下只获取 python 中的时间?

如何在没有插件的情况下从特定类别的帖子的 URL 中删除日期?

如何在没有时间的情况下解析当前日期?

我如何在没有日期的情况下显示 yfinancedata

如何在没有 sysdate 的情况下解决 2019 年以上没有日期输入的问题

如何在没有竞争条件的情况下订阅IObservable序列,强制完成并检索所有数据

具有嵌套AnimatedList的Firestore StreamBuilder

如何使用 StreamBuilder 获取特定的 Firestore 文档

如何在没有任何外部库的情况下从 Clojure 执行程序并实时显示其输出?

如何在没有实时CD或USB驱动器的情况下从14.10降级到14.04?