我正在使用Firestore来避免添加超过一个用户的竞争条件来聊天。如果事务超时,我将显示错误对话框。
但是,当我将这个逻辑移到带有Model2的ChangeNotifier (和Provider)中时,它现在会显示错误:
未处理的异常:在被释放后使用Model2。一旦在Model2上调用了dispose(),就不能再使用它了。
( Firestore事务没有问题。预期):
PlatformException(9,事务失败所有重试。:在事务中读取的每个文档也必须在该事务中写入。,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();
...有人知道解决办法吗?
谢谢!
更新:
如果在fetchData();之前从build方法中删除ChangeNotifierProxyProvider,则不会引发问题。
但为什么要解决这个问题呢?
发布于 2021-06-07 13:42:18
通过这些注释,调用fetchData()很可能会重新构建整个屏幕--调用dispose()方法。如果您仍然有问题,我建议在fetchData()中提供日志和代码以获得更好的上下文。
https://stackoverflow.com/questions/57559778
复制相似问题