was used after being disposed Once you have called dispose() on

 

我的解决办法

  1. 在报错的类中的创建一个 静态方法变量
  2. 构造方法赋值给 静态变量 当前的notifyListeners方法
  3. 通知时每次调用 静态变量 而非 自己 的notifyListeners

简单demo

class Cart extends ChangeNotifier {

  // 1.在报错的类中的创建一个 静态方法变量
  static Function staticNotifyListeners;

  static bool onceExe = true;

  Cart(int num, Cart oldCart) {
    // 2.构造方法赋值给 静态变量 当前的notifyListeners方法
    staticNotifyListeners=notifyListeners;

    debugPrint("cartInit:__"+hashCode.toString());
    if(onceExe){
      testLazyNotifier();
      onceExe=false;
    }
  }

  void testLazyNotifier() async {
    await Future.delayed(Duration(seconds: 5), () {
      debugPrint("future end :"+hashCode.toString());
      finalNum = 998;
      
      // 3.通知时每次调用 静态变量 而非 自己 的notifyListeners
      staticNotifyListeners();

    });
  }
  int finalNum;
}

解刨问题

我出现该问题的场景:

  1. 使用了 provider 中的 ChangeNotifierProxyProvider
  2. ChangeNotifierProxyProvider  中的异步方法 调用了 notifyListeners

思考报错信息

E/flutter (19338): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: A Cart was used after being disposed.
E/flutter (19338): Once you have called dispose() on a Cart, it can no longer be used.

使用了已经disposed 的方法.

一开始我想不明白,这究竟是什么意思.

我做了个实验.

分别在三个地方 输出 问题对象 的id,参考文章最上面的代码 

  1. 问题对象构造函数
  2. 调用notifyListeners 的前一刻
  3. 使用 该对象 位置

重现问题并输出结果

I/flutter (19338): cartInit:__876590056
I/flutter (19338): buildCart:__876590056
I/flutter (19338): cartInit:__38033970
I/flutter (19338): buildCart:__38033970
I/flutter (19338): future end :876590056
E/flutter (19338): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: A Cart was used after being disposed.
E/flutter (19338): Once you have called dispose() on a Cart, it can no longer be used.

思考问题产生

I/flutter (19338): cartInit:__876590056
I/flutter (19338): buildCart:__876590056

创建了 876590056 对象, 并在 build 中使用

I/flutter (19338): cartInit:__38033970
I/flutter (19338): buildCart:__38033970

由于依赖的父亲发生了变化,导致 子节点更新.

更新重建依赖对象为 38033970

I/flutter (19338): future end :876590056

因为 异步方法 是在 876590056 中执行的,他所调用的 notifyListeners 废弃对象 中的,所以报错.

总结

异步方法是在旧对象中执行 等他执行完毕后 notifyListeners 方法通知的是 旧对象

旧的对象在被替换时会被调用 

class ChangeNotifier  中的 如下方法
@mustCallSuper
  void dispose() {
    assert(_debugAssertNotDisposed());
    _listeners = null;
  }

dispose 的对象 冥顽不顾 接着调用 notifyListeners 导致 意外发生

bool _debugAssertNotDisposed() {
    assert(() {
      if (_listeners == null) {
        throw FlutterError(
          'A $runtimeType was used after being disposed.\n'
          'Once you have called dispose() on a $runtimeType, it can no longer be used.'
        );
      }
      return true;
    }());
    return true;
  }

 

Davinci 是一种先进的人工智能模型训练框架,可以用于自然语言处理和语音合成等任务。在 Window 操作系统上部署 Davinci 需要以下几个步骤。 首先,确保您的计算机满足 Davinci 的系统要求。Davinci 要求电脑系统为64位的 Windows 10或更高版本,并且至少具有16 GB 的内存。同时,您需要保证在电脑上已经安装了 CUDA 和 cuDNN 的最新版本,以支持 DNN 模型的加速计算。 接下来,您需要下载并安装适用于 Windows 的 CUDA 和 cuDNN 工具包。这些工具包可以到官方网站上进行下载,并按照安装指南进行安装安装完成后,您需要将 CUDA 和 cuDNN 的路径添加到系统的环境变量中,以便能够正确地引用这些工具包。 然后,在您的 Python 开发环境中安装 Davinci。可以使用 pip 安装指令,在命令行中输入 pip install -i https://pypi.douban.com/simple "davinci" 来安装 Davinci。等待安装完成后,您就可以在 Python 中引用 Davinci,并开始使用它进行模型训练和任务处理了。 最后,在您的代码中使用 Davinci 进行任务处理。您需要加载相应的模型,通过 Davinci 提供的 API 进行文本/语音处理,根据您的需求进行模型训练和生成文本或语音。可以根据 Davinci 的官方文档和示例代码来了解更多关于如何使用 Davinci 的详细信息。 总结起来,部署 Davinci 在 Window 上需要满足系统要求、安装 CUDA 和 cuDNN 工具包、安装 Davinci Python 包,并在代码中使用 Davinci 进行任务处理。希望以上回答能够对您有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值