为什么runApp()执行前设置FlutterError.onError不生效?
Flutter自定义onError被覆盖的根本原因
核心触发逻辑是runApp()内部的初始化流程会主动重置FlutterError.onError全局配置,覆盖调用前设置的所有自定义回调:
- 先赋值
FlutterError.onError、后调用runApp的执行链路:- 开发者手动将自定义错误处理逻辑赋值给
FlutterError.onError - 调用
runApp时,方法入口首先会执行WidgetsFlutterBinding.ensureInitialized()完成框架全局绑定初始化,初始化流程中会主动执行FlutterError.onError = FlutterError.dumpErrorToConsole,将错误处理回调重置为系统默认的控制台打印实现,直接覆盖之前设置的自定义逻辑 - 后续触发Flutter框架层异常时,调用的是已经被重置为默认实现的onError,自定义逻辑自然无法执行
- 开发者手动将自定义错误处理逻辑赋值给
- 先调用
runApp、后赋值FlutterError.onError的执行链路:runApp启动时先完成全局绑定初始化,将FlutterError.onError设置为默认值- 初始化完成后,开发者的赋值操作将默认回调替换为自定义实现,后续触发异常时就会正常执行自定义逻辑
不需要依赖执行顺序的稳妥标准写法如下,主动确保初始化完成后再配置回调即可:
void main() { // 手动触发框架绑定初始化,完成所有默认配置 WidgetsFlutterBinding.ensureInitialized(); // 初始化完成后再设置自定义错误回调,不会被覆盖 FlutterError.onError = (details) { if (details.stack != null) { Zone.current.handleUncaughtError(details.exception, details.stack!); } else { FlutterError.presentError(details); } }; runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者Zhu
相关产品推荐
相关产品推荐

