【发布时间】:2019-12-24 20:27:56
【问题描述】:
我使用 Firestore 事务来避免添加超过 1 个用户聊天的竞争条件。如果事务超时,我会显示错误对话框。
但是当我用ChangeNotifier(和Provider)将此逻辑移动到Model2时,它现在显示错误:
未处理的异常:在处置后使用了 Model2。一旦您 已经在 Model2 上调用了 dispose(),它就不能再使用了。
(Firestore 事务没有问题。这是预期的):
PlatformException(9, Transaction all retries failed.: 每个文档 在一个事务中读取也必须在该事务中写入。,null)
似乎ChangeNotifier 调用dispose() 为时过早?
这意味着它不允许我处理竞争条件的错误,因为它已经被处置了。
型号:
class Model2 extends ChangeNotifier {
...
bool userAdded;
Future<bool> addUser() async {
try {
await Firestore.instance.runTransaction((transaction) async {
DocumentSnapshot chatRoomDocSnapshot =
await transaction.get(chatRoomDocRef);
bool userInChat = await chatRoomDocSnapshot[‘userInChat'];
if (userInChat == false) {
await transaction.update(chatRoomDocSnapshot.reference, {
‘userInChat': true,
});
}
});
await chatUserRef.setData({
‘User’: user,
});
userAdded = true;
notifyListeners();
} catch (e) {
print(e);
userAdded = false;
notifyListeners();
}
return userAdded;
}
Provider(在有状态小部件中):
fetchData();
return ChangeNotifierProxyProvider<Model1, Model2>(
initialBuilder: (_) => Model2(),
builder: (_, model1, model2) => model2
..string = model1.string,
),
child: Consumer<Model2>(
builder: (context, model2, _) =>
...
await model2.addUser();
...
有人知道解决办法吗?
谢谢!
更新:
如果我在 ChangeNotifierProxyProvider 之前从 build 方法中删除 fetchData(); ,则不会引发问题。
但是为什么这能解决问题呢?
【问题讨论】:
-
这个 sn-p 不足以重现问题。它可能是多方面的,例如与导航相关的或未正确处理的侦听器。
-
@RémiRousselet 导航没有问题,因为如果我删除导航器,它仍然会抛出。我不在任何地方打电话给
dispose()。provider句柄dispose()自动吧? -
@RémiRousselet 我通过从
build方法中删除函数来解决问题。为什么要解决这个问题? -
啊,你在构建方法中调用
fetchData?
标签: firebase flutter dart google-cloud-firestore flutter-provider