如何等待ValueNotifier的value变为非null值?
解决ValueNotifier等待非null值的方案
针对你遇到的场景,这里提供几种实用的实现方式:
方式一:直接在方法内用Completer监听
先检查当前myNotifier.value是否已经非null,若已初始化则直接执行后续逻辑;否则通过Completer监听值的变化,直到获取到非null值:
Future<void> myMethod() async { // 先检查当前值是否已就绪 if (myNotifier.value == null) { final completer = Completer<MyType>(); void listener() { final value = myNotifier.value; if (value != null) { completer.complete(value); myNotifier.removeListener(listener); // 拿到值后移除监听,避免内存泄漏 } } myNotifier.addListener(listener); // 等待值初始化完成 await completer.future; } // 此时myNotifier.value一定非null,可安全使用 assert(myNotifier.value != null, 'This requires myNotifier.value to be non-null'); // 执行后续操作 }
方式二:封装复用的工具方法
如果多个地方需要等待这个ValueNotifier初始化,可以封装一个通用方法,提高代码复用性:
Future<MyType> waitForMyNotifierReady() async { if (myNotifier.value != null) { return myNotifier.value!; } final completer = Completer<MyType>(); void listener() { final value = myNotifier.value; if (value != null) { completer.complete(value); myNotifier.removeListener(listener); } } myNotifier.addListener(listener); return completer.future; } // 调用方式 Future<void> myMethod() async { await waitForMyNotifierReady(); assert(myNotifier.value != null, 'This requires myNotifier.value to be non-null'); // 执行后续操作 }
注意事项
- 一定要在获取到值后移除监听,避免不必要的资源占用和内存泄漏。
- 如果存在
myNotifier永远不会被赋值的场景,建议给Completer设置超时,防止方法一直挂起:// 示例:添加10秒超时 await completer.future.timeout(const Duration(seconds: 10), onTimeout: () { myNotifier.removeListener(listener); throw TimeoutException('myNotifier初始化超时'); });
内容的提问来源于stack exchange,提问作者Valentin Vignal
相关产品推荐
相关产品推荐

