【问题标题】:How to retrieve a model from method channel?如何从方法通道中检索模型?
【发布时间】:2021-01-07 17:47:49
【问题描述】:

我想通过方法通道将模型从原生 Android 检索到 Flutter。我当前的代码:

       new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
                new MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall methodCall, Result result) {
                        if (methodCall.method.equals("getModel")) {
                            
                            NewModel model = new NewModel();
                            model.id = 1;
                            model.title = "Title is here!";

                            result.success(model);
                        }

                    }
                }
        );

这是我的NewModel

class NewModel {
    public int id;
    public String title;
}

在 Flutter 中,我有相同的模型,并尝试使用以下代码获得响应:

NewModel response = await platformMethodChannel.invokeMethod('getModel');
class NewModel {
  int id;
  String title;
}

这是错误:

E/MethodChannel#com.methodchannel/test(25656):  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#com.methodchannel/test(25656):  at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#com.methodchannel/test(25656):  at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/MethodChannel#com.methodchannel/test(25656):  at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#com.methodchannel/test(25656):  at android.os.MessageQueue.next(MessageQueue.java:326)
E/MethodChannel#com.methodchannel/test(25656):  at android.os.Looper.loop(Looper.java:183)
E/MethodChannel#com.methodchannel/test(25656):  at android.app.ActivityThread.main(ActivityThread.java:7211)
E/MethodChannel#com.methodchannel/test(25656):  at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#com.methodchannel/test(25656):  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
E/MethodChannel#com.methodchannel/test(25656):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)


我该如何解决这个问题?

注意:我可以成功获得唯一的string 响应和string list 响应,如之前在here 中所要求的。但我不能得到一个模型。所以,这不是一个重复的问题。

【问题讨论】:

  • 你确定是在 Flutter 中调用右边methodChannel 的方法吗?
  • 是的。我可以得到一个字符串值。

标签: java android flutter


【解决方案1】:

您可以将模型转换为 JSON。然后就可以将 JSON 转换为模型了。

首先,您需要在您的Java 模型中添加toString() 方法,如下所示:

class NewModel {
    public int id;
    public String title;

    @Override
    public String toString() {
        return   "{\"id\": "+id+",\"title\": \""+ title+"\"}";
    }
}

然后,您可以像这样将您的模型转换为String

   new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall methodCall, Result result) {
                    if (methodCall.method.equals("getModel")) {
                        
                        NewModel model = new NewModel();
                        model.id = 1;
                        model.title = "Title is here!";

                        result.success(model.toString()); // In here!
                    }

                }
            }
    );

  string response = await platformMethodChannel.invokeMethod('getModel');

   NewModel model=json.decode(response);

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2018-08-30
    • 1970-01-01
    • 2022-12-22
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多