ChangeNotifier处理模型为时过早

时间:2019-08-19 15:29:15

标签: firebase flutter dart google-cloud-firestore flutter-provider

我正在使用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,则不会抛出问题。

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

1 个答案:

答案 0 :(得分:0)

仔细阅读评论,很可能调用 fetchData() 会重建整个屏幕 - 调用 dispose() 方法。如果您仍有问题,我建议您在 fetchData() 中提供日志和代码以获得更好的上下文。