0

我正在使用 Firestore 事务来避免添加超过 1 个用户聊天的竞争条件。如果事务超时,我会显示错误对话框。

但是,当我将此逻辑移至Model2with 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

但是为什么这可以解决问题?

4

1 回答 1

0

通过评论,调用很可能会fetchData()重建整个屏幕 - 调用该dispose()方法。如果您仍然遇到问题,我建议提供日志和内部代码fetchData()以获得更好的上下文。

于 2021-06-07T13:42:18.147 回答