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



我在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;

它被设置为不可空的,因为我要建立一个严格的模式。但这不是问题,因为它在数据库中不是空的。我已将customer_type添加到集合中的所有文档中。并且它们都没有将值设置为null。

这只能意味着我从Firestore得到的地图,找不到必需的钥匙。这意味着我仍然从Firestore获得旧数据(没有新字段)。到底发生了什么事?至少当我清空缓存时,它应该给我更新的数据。

因为您的代码在Firestore控制台添加新字段之前正常工作,这意味着问题在于您的新字段.

问题是您在Firestore中添加了一个字段,与您的模型(类Customer)拼写不同(区分大小写或打字错误),或者type不合适(例如,您尝试从String读取int,或者您尝试从map读取array等)

如果没有帮助,请告诉我。

到目前为止我所知道的是,在从服务器获取更新版本之前,流返回文档的即时本地快照。这是有道理的;除了如果我清除缓存,那么它应该直接到服务器,而不会给我任何错误-这不会发生。

我认为Firestore可能将本地快照存储在更多的地方,而不仅仅是缓存,但这仅仅是我的猜测。

目前,我通过在构造函数中做一个简单的null检查来修补这个问题:

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

这个修复是不确定的,我不会把它标记为答案,因为我觉得应该对发生的事情进行适当的解释。

最新更新