#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
4. Вы можете попробовать конвертировать в формат JSON
5. если у вас
AudioModel
есть два строковых поля:foo
аbar
затем просто отправьте:[{'foo': 'f0', 'bar': 'b0'}, {'foo': 'f1', 'bar': 'b1'}]