Flutter页面dispose调用Provider.of时报Null check operator空值错误
问题原因
- 当调用
Navigator.pop(context)离开页面时,当前页面对应的context会首先被标记为已卸载(unmounted),不再属于Flutter的有效Element树,无法再用来进行父级节点查找操作。 Provider.of<T>(context, listen: false)的本质是沿着传入context对应的Element树向上遍历,查找上层已注册的Provider实例。传入已卸载的context时,遍历过程会触发Provider内部的空值检查运算符报错,和你定义的GoogleMapsNotifier内部逻辑完全无关,所以哪怕Notifier类为空,错误依然会触发。- 该错误属于框架生命周期阶段的非致命异常,仅会在日志中打印,不会中断应用主进程,所以后续运行不受影响。
解决方案
方案1:提前缓存Provider实例
在页面initState阶段(此时context完全有效)就提前获取GoogleMapsNotifier实例存储为State类的成员属性,dispose阶段直接调用缓存的实例即可:
class YourPageState extends State<YourPage> { late GoogleMapsNotifier _googleMapsNotifier; // 其他属性省略 @override void initState() { super.initState(); _googleMapsNotifier = Provider.of<GoogleMapsNotifier>(context, listen: false); } @override void dispose() { _googleMapsNotifier.dispose(); locationSubscription.cancel(); boundsSubscription.cancel(); addressSearchController.dispose(); super.dispose(); } // 其他逻辑省略 }
方案2:使用Provider的autoDispose能力
如果你的GoogleMapsNotifier是和当前页面生命周期绑定的,直接在定义Provider时使用autoDispose修饰,Provider会在页面销毁时自动执行Notifier的dispose方法,不需要手动在页面的dispose中调用。
内容的提问来源于stack exchange,提问作者TonyWyomy
相关产品推荐
相关产品推荐

