在Flutter中获取Android活动结果

ZzZ*_*mbo 5 android flutter

我有一个第三方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}.');
        }
    }
Run Code Online (Sandbox Code Playgroud)

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么问题?widget.user.address = result.keys.toList()[0];永远不会达到断点,这意味着结果永远不会被发回。

ZzZ*_*mbo 8

结果证明代码几乎是正确的。Android 端不需要任何更改,但在 Flutter 端我必须进行以下更改:

转动

final Map<String, List<double>> result = await platform.invokeMethod(
Run Code Online (Sandbox Code Playgroud)

进入

final result = await platform.invokeMethod(
Run Code Online (Sandbox Code Playgroud)

即简单地从变量中删除显式类型,因为 的返回值platform.invokeMethod是某种内部哈希映射(特别是,它的名称以下划线开头)而不是Map指定的。Flutter 在控制台输出中没有显示任何错误,因为出于某种原因,它只捕获带有附加到应用程序的 Android 部分的调试器的 Android 日志,一旦我想出如何在 Android Studio 中调试 Android 代码,我立即找到了原因.