Flutter Riverpod:StateNotifier处理异步调用的正确方式及资源释放疑问
在Flutter中使用Riverpod的StateNotifier处理异步调用的正确方式
当控制器销毁时,是否需要像方案B那样担心getStringResult异步调用的问题?还是无需担忧,可采用简洁的方案A?
方案A
class Controller extends StateNotifier<String?> { final Repository repository; Controller(this.repository):super(null); startAsyncJob() async { state = await repository.getStringResult(); } }
使用StreamSubscription的方案B
class Controller extends StateNotifier<String?> { final Repository repository; StreamSubscription? sub; Controller(this.repository):super(null); startAsyncJob() { sub?.cancel(); sub = repository.getStringResult().asStream().listen((event) { state = event; }); } @override void dispose() { sub?.cancel(); super.dispose(); } }
方案A是完全可行且更简洁的正确方式,你确实想多了,没必要用方案B。
原因如下:
- StateNotifier被销毁(调用
dispose)后,即便后续异步调用getStringResult完成,尝试更新state的操作会被StateNotifier内部自动拦截忽略,不会引发异常或内存泄漏问题。 - 方案B将Future转为Stream并管理订阅属于冗余操作,徒增代码复杂度,完全没必要。
- 普通的Future异步任务不会因控制器销毁被强制取消,但即便它最终完成,更新state的动作已经无效,不会造成任何影响。如果你的业务场景确实需要主动取消异步任务,那得依赖
getStringResult自身支持取消(比如使用CancelableOperation),但绝大多数常规场景下不需要额外处理。
内容的提问来源于stack exchange,提问作者user21121176
相关产品推荐
相关产品推荐

