当我从控制台向文档添加字段时,Flutter Firestore不提供更新的数据

oalqel3c  于 6个月前  发布在  Flutter
关注(0)|答案(3)|浏览(63)

我在Flutter Firestore 2.5.3中遇到了一个奇怪的错误,如果我在Firebase控制台中向文档添加一个新字段(customer_type),应用程序无法检索新添加的字段并抛出异常:
CastError (type 'Null' is not a subtype of type 'String' in type cast)
但它不是空的。我从Firebase控制台添加了新字段的值。它在文档中。原来Firebase正在获取旧文档数据而没有新添加的字段。
我使用的是Riverpod的StreamProvider。代码如下:

static Stream<Customer?> _watchCustomer(final ProviderRefBase ref) async* {
  final auth = await ref.watch(authProvider.last);
  if (auth == null) {
    yield null;
  } else {
    final customerRef = _db.collection('customers').toCustomerRef(auth.uid);
    await for (var customer in customerRef.snapshots().map((doc) => doc.data())) yield customer;
  }
}

字符串
会出什么问题呢?

编辑:
所有的名称、集合和字段都是正确的,它们的类型也是正确的。如果我重新安装应用程序或完全清除应用程序存储,同样的代码也会正常工作。但是,如果我只是清除该高速缓存,它就不起作用了。它在调试时妨碍了我的工作流程,我想知道为什么会发生这种情况。为了更多的参考,这里是我的“客户”模型:

Customer.fromMap(final String documentID, final Map<String, dynamic> map)
  : id = documentID,
    name = map['customer_name'] as String,
    mobile = map['customer_mobile'] as String,
    type = map['customer_type'] as String;


它被设置为不可空,因为我正在建立一个严格的模式。但这不应该是一个问题,因为它在数据库中不是null。我已经将customer_type添加到集合中的所有文档中。它们都没有设置为null的值。
这只能意味着我从Firestore获取的Map,找不到必要的键.这意味着我仍然从Firestore获取旧数据(没有新字段).什么给?它应该给我更新的数据时,我清除该高速缓存至少.

bnl4lu3b

bnl4lu3b1#

因为在Firestore控制台中添加新字段之前,您的代码一直工作正常,这意味着问题出在您的新字段上。
问题是您在Firestore中添加了一个字段,其拼写与您的模型(类Customer)不同(区分大小写或拼写错误),或者type不合适(例如,您尝试从String读取int,或者您尝试从map读取array等)。
让我知道如果这没有帮助吗?

9udxz4iz

9udxz4iz2#

到目前为止,我所知道的是,流在从服务器获取更新版本之前立即返回Document的本地快照。这是有道理的;除了如果我清除该高速缓存,那么它应该直接转到服务器,而不会给予我任何错误-这不会发生。
我认为Firestore可能将本地快照存储在更多的地方,而不仅仅是该高速缓存,但这仅仅是我的猜测。
目前,我已经通过在构造函数中进行简单的null检查来修补了这个问题:

type = map['customer_type'] as String? ?? 'customer'

字符串
然而,这个修复是不确定的,我不会把这个作为答案,因为我觉得应该对发生的事情做出适当的解释。

am46iovg

am46iovg3#

我在从https://console.firebase.google.com/(我的客户端是google/cloud/firestore Ruby gem)添加文档字段时遇到了类似的行为:从浏览器中的Firebase控制台添加字段,当从我的应用程序查询同一文档时,我无法看到新字段。
刷新浏览器页面对我来说很有效。在我这样做之后,从Firebase控制台添加字段导致该字段出现在我的应用程序中。

相关问题