我正在使用Firestore交易来避免添加超过1位用户聊天的竞争状况。如果事务超时,则显示错误对话框。
但是当我使用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;
}
提供者(在有状态小部件中):
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
,则不会抛出问题。
但是为什么可以解决此问题?
答案 0 :(得分:0)
仔细阅读评论,很可能调用 fetchData()
会重建整个屏幕 - 调用 dispose()
方法。如果您仍有问题,我建议您在 fetchData()
中提供日志和代码以获得更好的上下文。