抖动隔离中的共享首选项

尼舒丹S

我是新手,我刚刚学习了如何在Dart中使用隔离。当我尝试通过隔离访问共享首选项时,它抛出以下给定的错误。当我尝试访问Firebase分析和远程配置时,也会出现此错误。如何解决此问题并在隔离中访问SharedPreference,FirebaseRemote配置和FirebaseFirestore?

[ERROR:flutter/runtime/dart_isolate.cc(882)] Unhandled exception:
E/flutter (23694): ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
E/flutter (23694): 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 (23694): 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 (23694): #0      defaultBinaryMessenger.<anonymous closure> (package:flutter/src/services/binary_messenger.dart:92:7)
E/flutter (23694): #1      defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:105:4)
E/flutter (23694): #2      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:143:62)
E/flutter (23694): #3      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:149:36)
E/flutter (23694): #4      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:332:12)
E/flutter (23694): #5      MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:359:49)
E/flutter (23694): #6      MethodChannelSharedPreferencesStore.getAll (package:shared_preferences_platform_interface/method_channel_shared_preferences.dart:54:22)
E/flutter (23694): #7      SharedPreferences._getSharedPreferencesMap (package:shared_preferences/shared_preferences.dart:191:57)
E/flutter (23694): #8      SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart:58:19)
E/flutter (23694): #9      _wraperState.islt (package:spynett/main.dart:122:55)
E/flutter (23694): <asynchronous suspension>
E/flutter (23694): #10     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:304:17)
E/flutter (23694): #11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)


void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await setupLocator();
  runApp(MyApp());
}

@override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_){
      startinitsetup();
    });
  }

Future startinitsetup() async{
    debugPrint('Calling setup');
    await _dynamiclink.handledynamiclink();
    await _pushNotificationService.initilalise();
    await _remoteConfigService.initialise();

    ReceivePort reciveport = ReceivePort();
    Isolate.spawn(islt, reciveport.sendPort);

    SendPort childSendPort = await reciveport.first;
    ReceivePort responceport = ReceivePort();
    childSendPort.send(['message',responceport.sendPort]);
    await responceport.first;
  }

static Future<int> islt(SendPort mainSendPort) async{
  ReceivePort childRecivePort = ReceivePort();
  mainSendPort.send(childRecivePort.sendPort);
  await for (var message in childRecivePort){
    SendPort replyport = message[1];
    SharedPreferences _pref = await SharedPreferences.getInstance();
    replyport.send('done');
  }
}

chunhunghan

您可以复制粘贴运行下面全码
为了在使用SharedPreferencesIsolate,你可以使用包https://pub.dev/packages/flutter_isolate
您可以从改变

Isolate.spawn(islt, reciveport.sendPort);

FlutterIsolate.spawn(islt, reciveport.sendPort);

完整测试代码的输出

I/flutter (12689): Calling setup
...
I/flutter (12689): test test
I/flutter (12689): isolate when msg recived
I/flutter (12689): reply done

完整的测试代码

import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_isolate/flutter_isolate.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  //await Firebase.initializeApp();
  //await setupLocator();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      startinitsetup();
    });
  }

  Future startinitsetup() async {
    debugPrint('Calling setup');

    ReceivePort reciveport = ReceivePort();
    FlutterIsolate.spawn(islt, reciveport.sendPort);

    SendPort childSendPort = await reciveport.first;
    ReceivePort responceport = ReceivePort();
    childSendPort.send(['message', responceport.sendPort]);
    String reply = await responceport.first;
    print("reply $reply");
  }

  static Future<int> islt(SendPort mainSendPort) async {
    ReceivePort childRecivePort = ReceivePort();
    mainSendPort.send(childRecivePort.sendPort);
    await for (var message in childRecivePort) {
      SendPort replyport = message[1];
      SharedPreferences _pref = await SharedPreferences.getInstance();
      await _pref.setString("yourKey", "test");
      String testPref = _pref.get("yourKey");
      print("test $testPref");
      debugPrint('isolate when msg recived');
      replyport.send('done');
    }
  }

  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

共享首选项中存储的值

来自分类Dev

共享首选项中的更新列表

来自分类Dev

片段中的共享首选项

来自分类Dev

清除共享首选项

来自分类Dev

共享首选项Facebook

来自分类Dev

共享首选项-Android

来自分类Dev

共享首选项值

来自分类Dev

共享首选项的差异

来自分类Dev

putStringSet() 共享首选项

来自分类Dev

共享首选项和首选项片段

来自分类Dev

无法在共享首选项中检索保存的值

来自分类Dev

如何防止在设置中清除共享首选项

来自分类Dev

Android Studio:无法在测试中写入共享首选项

来自分类Dev

如何在共享首选项中写入新值

来自分类Dev

Android中字符串的共享首选项

来自分类Dev

无法在共享首选项中检索保存的值

来自分类Dev

如何在共享首选项中存储多个键值对

来自分类Dev

尝试从共享首选项中检索数据

来自分类Dev

共享首选项中的联系人存储

来自分类Dev

无法从共享的首选项中获取布尔值

来自分类Dev

在片段“致命异常”中单击。片段的共享首选项

来自分类Dev

如何清除片段中的共享首选项?

来自分类Dev

在共享首选项中的存储列表上应用 notifyDataSetChanged

来自分类Dev

在异步任务类中获取共享首选项

来自分类Dev

在Android中共享首选项

来自分类Dev

共享首选项的最佳做法

来自分类Dev

共享首选项和轮换

来自分类Dev

使用共享首选项保存高分

来自分类Dev

Xamarin.Forms共享首选项