Flutter未处理的异常:在初始化绑定之前访问了ServicesBinding.defaultBinaryMessen



我正在尝试创建一个Isolate un-Flutter,然后使用此隔离从Firebase实时数据库中获取一些数据。

我正在一个名为home.dart(非main(的文件中创建去隔离,下面是我为该文件编写的代码。我有一个类来创建"隔离"one_answers"隔离"要执行的函数。在这个函数中,我正在尝试获取数据。

void elIsolate(SendPort sPort) async {

print("Fetching data");
final databaseReference = FirebaseDatabase.instance.reference().child("categories");
DataSnapshot info;
/*databaseReference.once().then((DataSnapshot snapshot) {
info = snapshot;
print(info.value);
});*/
print("new isolate created");
IsolateChannel channel = IsolateChannel.connectSend(sPort);
channel.stream.listen((data) {
print('newIsolate received : $data');
});
channel.sink.add("hi");
}
class _MyHomePageState extends State<MyHomePage> {
List list = [];
void initState(){
WidgetsFlutterBinding.ensureInitialized();
super.initState();
print("Init state");
loadIsolate();
}
Future loadIsolate() async {
await Firebase.initializeApp();
print("Load isolate");
ReceivePort rPort =  ReceivePort();
IsolateChannel channel = IsolateChannel.connectReceive(rPort);
channel.stream.listen((data) {
print('rootIsolate received : $data');
channel.sink.add('How are you');
});
await Isolate.spawn(elIsolate, rPort.sendPort);
/*await Isolate.spawn(getAllWorkers, receivePort.sendPort);
receivePort.listen((message) {
print(message);
});*/
}
} 

然后我有了main.dart。我在main函数中添加了这一行:WidgetsFlutterBinding.ensureInitialized((;

这是我的代码

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
bool resp;
await SharedPreferences.getInstance().then((prefs) {
resp = prefs.getBool('isUser');
if (resp == null) {
FirebaseAuth _auth = FirebaseAuth.instance;
resp = (_auth.currentUser != null);
prefs.setBool('isUser', resp);
}
});
runApp(MyApp(user: resp));
}
flutter_isolate: ^2.0.2
onPressed: () {
FlutterIsolate.spawn(_isolateEntrypoint, "");
}

// A "top level" function (i.e. not inside a class or make it static)
_isolateEntrypoint(String foo) {
WidgetsFlutterBinding.ensureInitialized();
...
}

确保授权和初始化是在同一个主线程上进行的(顶级或静态(。

现在这个FlutterEngine将能够与Firebase实时数据库通信,但主FlutterEngine不能。在实践中,根据应用程序的不同,应用程序可能希望从任一引擎(或两者(与实时数据库进行通信。在后台应用程序中,更可能是从这里而不是主隔离,但这同样取决于应用程序。

最新更新