首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隔离中调用sqflite函数引起错误

隔离中调用sqflite函数引起错误
EN

Stack Overflow用户
提问于 2019-06-29 15:29:40
回答 1查看 2.4K关注 0票数 0

我有一个sqflite数据库工作,单元测试工作。我想在onTap方法中调用sqflite方法。我知道我不能在主UI线程中执行sqflite函数(Flutter在运行时告诉我这一点)。所以我创建了一个隔离器来调用sqflite函数,这会产生一个不同的错误。如果我不调用sqflite函数,这个隔离器就能工作,如果我只返回一个bool,它就会工作。下面是代码和异常--谢谢您的建议:

来自UI的片段

代码语言:javascript
复制
    Widget loginButton(BuildContext context) {
    return Expanded(
      child: Padding(
        padding: const EdgeInsets.only(left: 20.0, right: 5.0, top: 20.0, bottom: 0.0),
        child: GestureDetector(
          onTap: () {
            if (emailController.text.length > 1 && passwordController.text.length > 7) {
              /// Find user. Then...
              doCheckIfFoundUser(emailController.text.trim(), passwordController.text);
            } else {
              printUserNotFound();
            }

          },
        child: buttonContainer(Colors.indigo, "Login", 20.0),
        ),
      ),
    );

方法从UI中调用。

代码语言:javascript
复制
doCheckIfFoundUser(String email, String password) async {
    var result;
    List<String> emailPasswordList = new List();
    emailPasswordList.add(email);
    emailPasswordList.add(password);
    var receivePort = new ReceivePort();
    Isolate.spawn(callbackFunction, receivePort.sendPort);
    SendPort sendPort = await receivePort.first;
    var ans = await sendReceive(sendPort, emailPasswordList);
    setState(() {
      result = ans;
      print("The value is $result - please do your thing");
    });
}

隔离回调

代码语言:javascript
复制
static void callbackFunction(SendPort callerSendPort) async {

    ReceivePort newIsolateReceivePort = ReceivePort();


    callerSendPort.send(newIsolateReceivePort.sendPort);
    var msg = await newIsolateReceivePort.first;
    List<String> emailPasswordList = msg[0];

    print("email: ${emailPasswordList[0]}, password: ${emailPasswordList[1]}");

    bool foundUser = await searchForUser(emailPasswordList[0], emailPasswordList[1]);
    SendPort replyPort = msg[1];
    replyPort.send(foundUser);
}
代码语言:javascript
复制
Future sendReceive(SendPort send, message) {
  ReceivePort receivePort = ReceivePort();
  send.send([message, receivePort.sendPort]);
  return receivePort.first;}

我/颤振(2073年):电子邮件:电子邮件,密码: Passw0rd E/颤振( 2073):错误:颤振/运行时/dart_solate.cc(805)未处理异常: E/颤振( 2073):错误:找不到本机函数'Window_sendPlatformMessage‘(4个参数) E/颤振(2073年):#0 Window.sendPlatformMessage (飞镖:ui/window.DAT:1089:9) E/ _DefaultBinaryMessenger._sendPlatformMessage (2073年):#1 _DefaultBinaryMessenger._sendPlatformMessage E/ _DefaultBinaryMessenger.send (2073年):#2 _DefaultBinaryMessenger.send E/ MethodChannel.invokeMethod (2073年):#3 MethodChannel.invokeMethod E/颤振( 2073): E/颤振(2073年):#4 invokeMethod (软件包:sqflite/src/sqflite_ind.dart:18:34) E/颤振( 2073): E/颤振(2073年):#5 SqfliteDatabaseFactoryImpl.invokeMethod (包:sqflite/src/工厂_src.2073:33:7) E/颤振(2073年):#6 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.safeInvokeMethod.(package:sqflite/src/factory_mixin.dart:22:35) E/颤振(2073年):#7 (package:sqflite/src/exception_impl.dart:7:34) E/ wrapDatabaseException ( 2073): E/颤振(2073年):#8 SqfliteDatabaseFactoryImpl.wrapDatabaseException (包:sqflite/src/工厂_inex.dart:29:7)。 E/颤振(2073年):#9 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.safeInvokeMethod (package:sqflite/src/factory_mixin.dart:22:7).E/颤振(2073年):#10 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.getDatabasesPath (package:sqflite/src/factory_mixin.dart:136:17).E/颤振( 2073):E/颤振( 2073):#11 getDatabasesPath。(包装:sqflite/sqflite.dart:166:54)E/ UsersSqflite.init (2073年):#12 UsersSqflite.initE/颤振( 2073):。E/颤振(2073年):#13 _LoginPageState.searchForUser。(包装:himrepo/ui/login.dart:268:24)E/颤振( 2073):。E/颤振(2073年):#14 _LoginPageState.callbackFunction(package:himrepo/ui/login.dart:166:28).E/颤振( 2073):。E/颤振( 2073):#15 _startIsolate.(dart:isolate-patch/isolate_patch.dart:304:17).E/颤振(2073年):#16 _RawReceivePortImpl._handleMessage(dart:isolate-patch/isolate_patch.dart:172:12).

直接执行Sqflite方法

代码语言:javascript
复制
E/AndroidRuntime( 6628): FATAL EXCEPTION: Sqflite
E/AndroidRuntime( 6628): java.lang.RuntimeException: Methods marked with @UiThread must be executed on the main thread. Current thread: Sqflite
E/AndroidRuntime( 6628):    at io.flutter.embedding.engine.FlutterJNI.ensureRunningOnMainThread(FlutterJNI.java:794)
E/AndroidRuntime( 6628):    at io.flutter.embedding.engine.FlutterJNI.invokePlatformMessageResponseCallback(FlutterJNI.java:727)
E/AndroidRuntime( 6628):    at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:140)
E/AndroidRuntime( 6628):    at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:225)
E/AndroidRuntime( 6628):    at com.tekartik.sqflite.SqflitePlugin$6.run(SqflitePlugin.java:778)
E/AndroidRuntime( 6628):    at android.os.Handler.handleCallback(Handler.java:873)
E/AndroidRuntime( 6628):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 6628):    at android.os.Looper.loop(Looper.java:193)
E/AndroidRuntime( 6628):    at android.os.HandlerThread.run(HandlerThread.java:65)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-30 13:25:56

感谢@pskink的帮助。隔离可以工作,但是当从Widget onTap事件运行sqflite时,我得到了异常。事实证明,我在pubspec.yaml中包含的一个插件(pubspec.yaml)在某种程度上导致了异常:“标记为@UiThread的方法必须在主线程上执行。当前线程: Sqflite”。删除该插件后,该应用程序就能工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56818746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档