如何使用方法通道将 List<Model> 数据发送回颤振?

时间:2021-07-09 08:06:58

标签: flutter

我准备使用方法通道将列表发送回颤振,下面是颤振活动的代码,

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler(
                    (call, result) -> {
                        if (call.method.equals("getMusicInfo")) {
                            List<AudioModel> tempAudioList = getMusicInfo();
                            Log.e("temp list",tempAudioList.size()+"");
                            if (!tempAudioList.isEmpty)
                                result.success(tempAudioList);
                            else {
                                result.error("UNAVAILABLE", "Current music information not available.", null);
                            }
                        } else {
                            result.notImplemented();
                        }
                    }
            );
}

public List<AudioModel> getMusicInfo() {

    final List<AudioModel> tempAudioList = new ArrayList<>();

    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Audio.AudioColumns.TITLE,MediaStore.Audio.AudioColumns.DATA,
            MediaStore.Audio.AudioColumns.ALBUM, MediaStore.Audio.ArtistColumns.ARTIST,};
    Cursor c = getContentResolver().query(uri, projection, null, null, MediaStore.Audio.AudioColumns.YEAR);

    if (c != null) {
        while (c.moveToNext()) {

            AudioModel audioModel = new AudioModel();
            String title = c.getString(0);
            String path = c.getString(1);
            String album = c.getString(2);
            String artist = c.getString(3);

            audioModel.setTitle(title);
            audioModel.setAlbum(album);
            audioModel.setArtist(artist);
            audioModel.setPath(path);

            tempAudioList.add(audioModel);
        }
        c.close();
    }

    return tempAudioList;
}

public class AudioModel {
    String title;
    String path;
    String album;
    String artist;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }
}

在 flutter main 中,按频道调用 getMusicInfo,

static const platform = const MethodChannel('com.flover.yani_music_java/get_music_list');
Future<List<AudioModel>> _getMusicInfo() async {
List<AudioModel> audioList = List.filled(0,AudioModel(),growable: true);
try {
  audioList = await platform.invokeMethod('getMusicInfo');
} on PlatformException catch (e) {
  print('error message is $e');
}

print('audio list size: ${audioList.length}');

return audioList;

}

最后是错误信息,

E/MethodChannel#com.flover.yani_music_java/get_music_list(24854): Failed to handle method call
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):java.lang.IllegalArgumentException: Unsupported value: com.flover.yani_music_java.MainActivity$AudioModel@9920456
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:276)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:265)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.plugin.common.StandardMethodCodec.encodeSuccessEnvelope(StandardMethodCodec.java:59)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:238)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at com.flover.yani_music_java.MainActivity.lambda$configureFlutterEngine$0$MainActivity(MainActivity.java:40)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at com.flover.yani_music_java.-$$Lambda$MainActivity$4c2r_ReOWihoZTjmJgPCmA3Md7g.onMethodCall(Unknown Source:2)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:818)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at android.os.MessageQueue.next(MessageQueue.java:325)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at android.os.Looper.loop(Looper.java:149)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at android.app.ActivityThread.main(ActivityThread.java:6825)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
E/MethodChannel#com.flover.yani_music_java/get_music_list(24854):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
I/flutter (24854): error message is PlatformException(error, Unsupported value: com.flover.yani_music_java.MainActivity$AudioModel@9920456, null, java.lang.IllegalArgumentException: Unsupported value: com.flover.yani_music_java.MainActivity$AudioModel@9920456
I/flutter (24854):  at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:276)
I/flutter (24854):  at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:265)
I/flutter (24854):  at io.flutter.plugin.common.StandardMethodCodec.encodeSuccessEnvelope(StandardMethodCodec.java:59)
I/flutter (24854):  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:238)
I/flutter (24854):  at com.flover.yani_music_java.MainActivity.lambda$configureFlutterEngine$0$MainActivity(MainActivity.java:40)
I/flutter (24854):  at com.flover.yani_music_java.-$$Lambda$MainActivity$4c2r_ReOWihoZTjmJgPCmA3Md7g.onMethodCall(Unknown Source:2)
I/flutter (24854):  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
I/flutter (24854):  at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFrom

我对这样的错误感到困惑,我无法通过 result.success() 发送 tempAudioList?根据错误信息,FlutterActivity 中的 AudioModel 在发送到 flutter main 时不受支持,但如何做到这一点?

0 个答案:

没有答案