我有一个第三方Android控件,不能直接在Flutter中使用。我把它放在一个Android活动中。然后,使用来自https://flutter.io/docs/development/platform-integration/platform-channels#step-3b-add-an-android-platform-specific-implementation-using-kotlin的信息,我可以成功启动该活动并在其中执行一些操作。唯一不起作用的部分是将结果发送回活动。
颤振代码:
void showDialog() async
{
try {
final Map<String, List<double>> result = await platform.invokeMethod('show_dialog',
<String, String>{
'address': widget.user.address
});
widget.user.address = result.keys.toList()[0];
} on PlatformException catch (e) {
print('Failed to pick address: ${e.message}.');
}
}
Android代码:
class MainActivity: FlutterActivity() {
private val CHANNEL = "dialog"
private lateinit var _result: MethodChannel.Result
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "show_dialog") {
_result = result
val intent = Intent(this@MainActivity, DialogActivity::class.java)
intent.putExtra("address", call.argument<String>("address"))
startActivityForResult(intent, 9689)
}
else result.notImplemented()
}
}
override fun onActivityResult(requestCode: Int, result: Int, intent: Intent?) {
if(requestCode != 9689)
return super.onActivityResult(requestCode, result, intent)
if (result == Activity.RESULT_OK) {
_result.success(mapOf(intent!!.getStringExtra("address") to
listOf(intent.getDoubleExtra("latitude", 0.0),
intent.getDoubleExtra("longitude", 0.0))))
}
else
_result.success(null)
}
}
出什么问题了?从未达到行widget.user.address = result.keys.toList()[0];
的断点,这表明结果从未发回。
答案 0 :(得分:1)
结果证明代码几乎是 正确。 Android方面不需要任何更改,但是在Flutter方面,我必须进行此更改:
转弯
final Map<String, List<double>> result = await platform.invokeMethod(
进入
final result = await platform.invokeMethod(
i。 e。只需从变量中删除显式类型,因为platform.invokeMethod
的返回值是某种内部哈希图(特别是其名称以下划线开头),而不是指定的Map
的返回值。 Flutter在控制台输出中未显示任何错误,因为由于某种原因,它仅捕获了带有附加到应用程序Android部分的调试器的Android日志,并且一旦我弄清楚了如何在Android Studio中调试Android代码,便立即发现了原因