Как отправить данные списка обратно в flutter с помощью канала метода?

#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
 

Меня смущает такая ошибка, я не могу отправить tempAudioList по результату.успех()? Согласно сообщениям об ошибках, аудиомодель в FlutterActivity не поддерживается при отправке в flutter main, но как это сделать?

Комментарии:

1. см. StandardMessageCodec официальный документ.

2. не повезло, все та же ошибка, когда я меняю список на ArrayList

3. api.flutter.dev

4. Вы можете попробовать конвертировать в формат JSON

5. если у вас AudioModel есть два строковых поля: foo а bar затем просто отправьте: [{'foo': 'f0', 'bar': 'b0'}, {'foo': 'f1', 'bar': 'b1'}]