【问题标题】:How to start an activity from flutter plugin using an API如何使用 API 从颤振插件开始活动
【发布时间】:2020-08-30 00:28:54
【问题描述】:

所以我正在制作一个 Flutter 插件,并尝试在 Android 上运行 Kotlin 代码。问题是,此代码运行一个方法,该方法尝试在意图上没有 FLAG_ACTIVITY_NEW_TASK 标志的情况下启动活动。这样做的问题是它也没有办法给它一个intent instance,因为它试图在方法本身内部实例化一个实例。该方法期望从存储在 UI 上并从中调用的按钮或其他方法调用。但是,由于是从 Flutter 插件中的onMethodCall 方法调用的,所以似乎不起作用。我尝试了许多变通方法,例如在 Activity 中添加一个方法并在从 Flutter 插件类调用它时运行其中的代码。我也尝试过使用 UIThread 也没有运气。任何解决方法?

注意:由于隐藏了这个 API,我没有提供任何代码。应该只知道我正在运行来自onMethodCall 事件的代码。

错误:Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

【问题讨论】:

  • 你有结果吗?
  • @Alexufo 我接触这个领域已经一年多了,所以我真的不记得我做了什么让它以某种方式工作。我相信我最终分叉了 API 或类似的东西,但如果我再次触摸它,我将标记为解决方案,无论是否可行。
  • 请让您的问题陈述尽可能清晰。很难阅读和理解您的内容。

标签: android flutter kotlin flutter-plugin


【解决方案1】:

您可以扩展您的插件以在您的插件类中实现ActivityAware,当您实现它时,您会得到几个回调,为您提供当前活动。像这样:

lateinit activity: Activity? = null
override fun onDetachedFromActivity() {
    activity = null
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    activity = binding.activity
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    activity = binding.activity
  }

  override fun onDetachedFromActivityForConfigChanges() {
    activity = null
  }

之后,您可以从分配的活动变量中启动活动。

如果您需要进一步的帮助,请告诉我。

【讨论】:

  • 是否可以打开ui活动并取回数据?
  • 您可以打开活动并监听 onActivityResult 并将该数据传回 Flutter
  • 访问以下链接获取官方文档:github.com/flutter/flutter/wiki/…
  • 嗨 Jav,我正在进入 startActivity Intent intent = new Intent(this.context, DummyActivity.class); ((Activity)context).startActivity(intent);错误,类插件中的构造函数不能应用于给定类型; flutterEngine.getPlugins().add(new com.example.coindcx_kyc.CoindcxKycPlugin()); ^ 我从 @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { context = flutterPluginBinding.getApplicationContext(); }
【解决方案2】:

正如你所提到的,对于 Flutter 插件,任何依赖于平台的逻辑都应该保存在 FlutterActivity 的子类中,该子类用于在本机模块中显示颤振模块/屏幕。现在您可以从该子类启动意图,而无需任何其他标志。

@note - FlutterActvity 的子类应该保留在原生模块中。

    class FlutterResponseActivity : FlutterActivity() {
        private var methodResult: Result? = null
        override fun provideFlutterEngine(context: Context): FlutterEngine? {
            return MyApplication.mContext.flutterEngine //Pre-warmed flutter engine
        }

        override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "startMainActivity" -> {
                    startMainActivity()
                    result.success(true)
                }
                else -> result.notImplemented()
            }
        }
    }

        private fun startMainActivity() {
             val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }

【讨论】:

  • 好吧,我毫不怀疑这段代码可以工作,但我试图在 Flutter 插件中实现这一点,除了 URL 方案等之外,几乎不需要手动配置本机代码。如果您可以确保它在插件环境中可用,我想再看看。乍一看,它看起来像是 Flutter 应用程序的解决方案,而不是 Flutter 插件的解决方案。我假设一个简单的解决方法可以让类实现并注册接口,但我想避免这样做,因为在我看来它会使插件对开发人员不太友好。
  • @Fern 你也可以尝试从 dart 插件进行深度链接和启动 URI。从未尝试过,但我认为这应该可以解决问题
  • @Tamil Arasu 你有例子如何从插件调用android活动吗?
  • 复制上面的代码并添加```activity.startActivity( ) ```
猜你喜欢
  • 2020-05-10
  • 2020-04-02
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多