【问题标题】:Flutter - Serializing a Java Pojo to Dart objectFlutter - 将 Java Pojo 序列化为 Dart 对象
【发布时间】:2020-05-07 22:37:54
【问题描述】:

我正在使用方法通道来调用 Flutter 中特定于平台的代码。 (https://flutter.dev/docs/development/platform-integration/platform-channels?tab=ios-channel-swift-tab#step-3-add-an-android-platform-specific-implementation)

在我的 MainActivity.java 文件中,我有

String methodCall = call.method;
  switch (methodCall) {
      case "getUser":
         User user = new User();
         user.setAccessToken("eyJhbGciOiJSUzI1Ni");
         user.setUserId("randomName123");
         user.setLocation("USA");
         Log.d("configureFlutterEngine", "Got a user: " + user.toString());
         result.success(user);
         break;

user 是 User 的一个实例(所有属性都是字符串)

public class User {
   private String accessToken;
   private String userId;
   private String location

result.success(user) 返回 User 的一个实例。

在我的 /lib/main.dart 文件中,我调用 getUser 方法,该方法路由到我的 Java 类。

  /// Signs a user out
  Future<void> _getUser() async {
    User user;
    try {
      user = await platform.invokeMethod('getUser');
      print("getUser button was pressed");
      setState(() {
        _user = user;
      });
    } on PlatformException catch (e) {
      print("Failed: '${e.message}'.");
    }
  }

Dart 中的 User 类是:

class User {
  String accessToken;
  String userId;
  String location;

但是,每当我运行我的代码时,我都会得到:

2020-01-21 13:37:55.065 12149-12149/com.package.name.sample E/MethodChannel#com.package.name/UserSignOn: Failed to handle method call
    java.lang.IllegalArgumentException: Unsupported value:
    Access Token: eyJhbGciOiJSUzI1Ni
    User ID: randomName123 
    Location: USA 

注意:如果我返回一个简单的字符串,而不是 User 对象,这可以正常工作,所以我认为这与将 POJO 序列化和反序列化为 Dart 对象有关

【问题讨论】:

  • 这个问题有进展吗?

标签: java flutter dart


【解决方案1】:

Flutter documentation on platform channels 中,可以传递给方法通道(及其 Java 等效项)的受支持 Dart 类型列表如下:

  • 飞镖类型:Java 类型
  • null:
  • bool: java.lang.Boolean
  • int: java.lang.Integer
  • int: java.lang.Long(如果 32 位不够用)
  • double: java.lang.Double
  • String: java.lang.String
  • Uint8List: 字节[]
  • Int32List: int[]
  • Int64List: long[]
  • Float64List: 双[]
  • List: java.util.ArrayList
  • Map: java.util.HashMap

如您所见,您无法通过方法通道发送原始 Java Pojo。任何数据都需要序列化为其中一种类型。对于 Pojo,将其序列化为 HashMap 可能是最直接的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-09-11
    • 2015-11-14
    相关资源
    最近更新 更多