运行环境 flutter doctor 运行结果
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel master, v1.9.8-pre.83, on Microsoft Windows [Version 10.0.17134.407], locale zh-CN)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.1)
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.2.3)
[√] Android Studio (version 3.5)
[√] VS Code (version 1.37.1)
[√] Connected device (2 available)
命令行运行输出
Launching lib\main.dart on BND AL10 in debug mode...
Initializing gradle...
Resolving dependencies...
Running Gradle task 'assembleDebug'...
Built build\app\outputs\apk\debug\app-debug.apk.
Installing build\app\outputs\apk\app.apk...
W/InputMethodManager(27779): startInputReason = 1
Syncing files to device BND AL10...
I/ViewRootImpl(27779): jank_removeInvalidNode jank list is null
W/InputMethodManager(27779): startInputReason = 5
E/flutter (27779): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
E/flutter (27779): If you're running an application and need to access the binary messenger before runApp()
has been called (for example, during plugin initialization), then you need to explicitly call the WidgetsFlutterBinding.ensureInitialized()
first.
E/flutter (27779): If you're running a test, you can call the TestWidgetsFlutterBinding.ensureInitialized()
as the first line in your test's main()
method to initialize the binding.
E/flutter (27779): #0 defaultBinaryMessenger. (package:flutter/src/services/binary_messenger.dart:73:7)
E/flutter (27779): #1 defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:86:4)
E/flutter (27779): #2 MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:140:62)
E/flutter (27779): #3 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:35)
E/flutter (27779):
E/flutter (27779): #4 SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart:25:27)
E/flutter (27779):
E/flutter (27779): #5 SpUtil._init (package:easy_market/utils/cache.dart:21:36)
E/flutter (27779):
E/flutter (27779): #6 SpUtil.getInstance (package:easy_market/utils/cache.dart:27:23)
E/flutter (27779):
E/flutter (27779): #7 main (package:easy_market/main.dart:17:25)
E/flutter (27779):
E/flutter (27779): #8 _runMainZoned.. (dart:ui/hooks.dart:229:25)
E/flutter (27779): #9 _rootRun (dart:async/zone.dart:1124:13)
E/flutter (27779): #10 _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (27779): #11 _runZoned (dart:async/zone.dart:1516:10)
E/flutter (27779): #12 runZoned (dart:async/zone.dart:1500:12)
E/flutter (27779): #13 _runMainZoned. (dart:ui/hooks.dart:221:5)
E/flutter (27779): #14 _startIsolate. (dart:isolate-patch/isolate_patch.dart:305:19)
E/flutter (27779): #15 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
E/flutter (27779):
D/AwareBitmapCacher(27779): handleInit switch not opened pid=27779
原因分析
master 分支中,flutter 官方去除了 flutter/packages/flutter/lib/src/services/binding.dart:41 中初始化。
/// This is used to send messages from the application to the platform, and
/// keeps track of which handlers have been registered on each channel so
/// it may dispatch incoming messages to the registered handler.
// const BinaryMessenger defaultBinaryMessenger = _DefaultBinaryMessenger ._();
const BinaryMessenger defaultBinaryMessenger;
因此在 runApp() 之前,一旦调用关于系统相关的方法(这里使用了 shared_preferences ),就需要手动调用
WidgetsFlutterBinding.ensureInitialized();
// 这会检测 defaultBinaryMessenger 状态并触发一次初始化
解决方案
在 main() 函数第一行使用
void main() async {
WidgetsFlutterBinding.ensureInitialized();
...
}
运行结果
通过
参考链接
Moved the default BinaryMessenger instance to ServicesBinding #37489
https://stackoverflow.com/questions/57689492/flutter-unhandled-exception-servicesbinding-defaultbinarymessenger-was-accesse