我正在使用 Firestore 事务来避免添加超过 1 个用户聊天的竞争条件。如果事务超时,我会显示错误对话框。
但是,当我将此逻辑移至Model2
with ChangeNotifier
(and 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
。
但是为什么这可以解决问题?