gam*_*ter 14 android dart flutter
在 Android API28 模拟器上运行的 Flutter 应用程序上,启动 Isolate 将导致应用程序崩溃并出现以下错误:
[不良状态:BackgroundIsolateBinaryMessenger.instance 值在执行BackgroundIsolateBinaryMessenger.ensureInitialized 之前无效。, #0 BackgroundIsolateBinaryMessenger.instance
我已经在运行WidgetsFlutterBinding.ensureInitialized();了runApp(const MyApp());,这应该确保BackgroundIsolateBinaryMessenger在应用程序开始运行之前已经初始化。
我们还需要跑步吗BackgroundIsolateBinaryMessenger.ensureInitialized?我们该怎么做?
import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sensors_plus/sensors_plus.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
double _x = 0;
static void _isolateTask(SendPort sendPort) async {
debugPrint("Inside _isolateTask");
accelerometerEvents.listen((AccelerometerEvent event) {
debugPrint('_isolateTask x: $event.x');
sendPort.send(event.x);
});
}
void _startIsolate() async {
debugPrint("_startIsolate()");
var receivePort = ReceivePort();
await Isolate.spawn(_isolateTask, receivePort.sendPort);
receivePort.listen((dynamic message) {
setState(() {
_x = message;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'X: $_x',
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _startIsolate,
tooltip: 'Start Isolate',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
Run Code Online (Sandbox Code Playgroud)
完整追踪
I/flutter ( 5071): _startIsolate()
I/flutter ( 5071): Inside _isolateTask
I/flutter ( 5071): error: [Bad state: The BackgroundIsolateBinaryMessenger.instance value is invalid until BackgroundIsolateBinaryMessenger.ensureInitialized is executed., #0 BackgroundIsolateBinaryMessenger.instance
_background_isolate_binary_messenger_io.dart:27
I/flutter ( 5071): #1 _findBinaryMessenger
platform_channel.dart:135
I/flutter ( 5071): #2 EventChannel.binaryMessenger
platform_channel.dart:629
I/flutter ( 5071): #3 EventChannel.receiveBroadcastStream.<anonymous closure>
platform_channel.dart:649
I/flutter ( 5071): #4 _runGuarded (dart:async/stream_controller.dart:814:24)
I/flutter ( 5071): #5 _BroadcastStreamController._subscribe (dart:async/broadcast_stream_controller.dart:207:7)
I/flutter ( 5071): #6 _ControllerStream._createSubscription (dart:async/stream_controller.dart:827:19)
I/flutter ( 5071): #7 _StreamImpl.listen (dart:async/stream_impl.dart:471:9)
I/flutter ( 5071): #8 new _ForwardingStreamSubscription (dart:async/stream_pipe.dart:114:10)
I/flutter ( 5071): #9 _ForwardingStream._createSubscription (dart:async/stream_pipe.dart:86:16)
I/flutter ( 5071): #10 _ForwardingStream.listen (dart:async/stream_pipe.dart:81:12)
I/flutter ( 5071): #11 _MyHomePageState._isolateTask
main.dart:44
I/flutter ( 5071): #12 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)
I/flutter ( 5071): #13 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)
I/flutter ( 5071): ]
Run Code Online (Sandbox Code Playgroud)
依赖关系
dependencies:
flutter:
sdk: flutter
wear: ^1.1.0
sensors_plus: ^2.0.2
Run Code Online (Sandbox Code Playgroud)
将令牌传递给隔离。
顶层函数:
Future<dynamic> computeIsolate(Future Function() function) async {
final receivePort = ReceivePort();
var rootToken = RootIsolateToken.instance!;
await Isolate.spawn<_IsolateData>(
_isolateEntry,
_IsolateData(
token: rootToken,
function: function,
answerPort: receivePort.sendPort,
),
);
return await receivePort.first;
}
void _isolateEntry(_IsolateData isolateData) async {
BackgroundIsolateBinaryMessenger.ensureInitialized(isolateData.token);
final answer = await isolateData.function();
isolateData.answerPort.send(answer);
}
class _IsolateData {
final RootIsolateToken token;
final Function function;
final SendPort answerPort;
_IsolateData({
required this.token,
required this.function,
required this.answerPort,
});
}
Run Code Online (Sandbox Code Playgroud)
使用方法:
var contacts = await computeIsolate(_getContacts);
// Make sure static function if inside class
static Future<List<Contact>> _getContacts() async {
final contacts = await FlutterContacts.getContacts(withProperties: true);
return contacts;
}
Run Code Online (Sandbox Code Playgroud)
小智 3
在隔离顶部添加BackgroundIsolateBinaryMessenger.ensureInitialized。
RootIsolateToken rootIsolateToken = RootIsolateToken.instance!;
void _isolateTask(SendPort sendPort) async {
debugPrint("Inside _isolateTask");
BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken);
accelerometerEvents.listen((AccelerometerEvent event) {
debugPrint('_isolateTask x: $event.x');
sendPort.send(event.x);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6360 次 |
| 最近记录: |