【问题标题】:ChangeNotifier dispose model too earlyChangeNotifier 过早地处理模型
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 2015-03-18
    • 2011-07-11
    • 2014-12-06
    • 2021-01-01
    • 2021-11-16
    • 2013-03-14
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多