【问题标题】:How do you pass the MethodChannel Result to a new Activity?如何将 MethodChannel Result 传递给新的 Activity?
【发布时间】:2018-07-06 22:33:05
【问题描述】:

Flutter 爱好者、专业人士和未来的朋友。我一直在努力将 MainActivity 中的 MethodChannel.Result 传递给一个新的活动(在那里执行一些工作后处理结果处理程序)。

在 iOS 中,我将 FlutterResult 填充到具有其他相关值的结构中,并将其传递给新的 ViewController,并从那里成功运行结果处理程序。

如何在 Android 中执行此操作?由于结果不可序列化,因此我无法将其作为额外内容添加到意图中。

在我的 MainActivity 中,我正在运行“setMethodCallHandler”,在正确的 call.method 情况下,我正在创建一个新意图并启动它。我已成功在新活动中添加和提取字符串值,但我需要传递的是 Flutter Result。

实现此目的的推荐方法是什么?我是不是走错路了?

我问我是否做错了,因为当我完成()这个新活动时,有一个半秒的黑屏在活动被解除时接管屏幕。

不确定是否重要,但我正在使用 Kotlin 编写。不过,我很乐意听到任何 Java 建议。

提前谢谢大家。

【问题讨论】:

  • 我在 IOS 中遇到了同样的问题,请问您可以添加 ios 代码吗?

标签: android kotlin flutter


【解决方案1】:

如果没有更多关于您在新活动中具体做什么的背景信息,很难说出为什么会出现黑屏。从理论上讲,flutter Activity 应该仍在运行,并且应该在您完成新 Activity 时显示出来 - 除非您在 UI 线程上做一些阻塞。

但是,对于传递result - 您要做的是在从颤振接收消息的任何地方保留对result 处理程序的引用,并使用android 的startActivityForResult 方法。请参阅getting a result from an activity 上的 android 文档。您的“工人”活动应该做它需要做的任何事情,然后在完成之前通过调用setResult 将结果传回。您传回的数据必须是可序列化的。

有一点额外的皱纹 - 您不一定在这里使用自己的活动(如果您正在编写插件)。如果是这种情况,您需要实现ActivityResultListener 并在插件的registerWith 函数中调用registrar.addActivityResultListener。如果您只是在应用程序中执行此操作,您可以简单地覆盖 onActivityResult - 只需确保调用 super 否则您可能会破坏其他 Flutter 插件。

对此还有另一种可能的解决方案,根据您想要的深度,有不同程度的 hacky-ness。解决方案是简单地使用 Singleton 或 Global 在活动之间存储您需要的内容。 对于正在阅读本文的任何人 - 我不赞成这样做,我只是提供一种替代方法。有一些注意事项 - 其中之一是全局变量和在较小程度上单例被认为是一个坏主意,原因有很多,其中包括代码可维护性。如果您绝对必须走这条路,我建议使用注册表模式而不是简单的单例 - 即您创建一个可序列化的密钥并将Result 存储在本质上使用该密钥的全局/单例映射中,将密钥传递给新活动,然后在新活动中使用该键检索值(并确保从地图中删除对象)。

请注意,如果应用程序被 android 停止,则 global/singleton/registry 选项将无法正常工作,因为可以根据其意图重新创建 Activity,但内存中的对象可能不会持续存在。再说一遍 - 颤振回调无论如何都不会持续,所以这一点可能无论如何都没有实际意义。

如果您在完成新 Activity 后仍然看到黑屏,这听起来更像是一个错误或与您的新 Activity 的实施有关,而不是颤振问题。

【讨论】:

  • 谢谢你,摩根。我是一名 iOS 开发人员,所以我不知道您提到的功能! // 在黑屏上,我必须找到一个设备并对其进行测试,因为现在我只在计算机上使用模拟的 Android 设备。也许这就是它的原因?我没有做任何特别的事情。只需使用两个文本视图开始一个新意图,FAB 只需轻按一次即可运行“finish()”。当activity向下关闭时,在Flutter屏幕重新出现之前,后面会有一个黑屏。
  • 我会看看我是否有机会在某个时候重现它(或者如果你的应用程序是开源的,我可以试试 =D)。肯定有一些东西在模拟器上不如真实设备好用,但希望这就是你所看到的。
  • 摩根,再次感谢您。只需使用“startActivityForResult”编写代码,我就能够成功地将序列化数据传递回 Flutter 应用程序。同样在物理设备上,原生活动的结束并不是在后台尴尬地保持几毫秒的黑屏,但同时,开始和结束是一个非常难看的、不平滑的过渡。您对如何在这里使过渡更平滑有任何指示吗?我试图覆盖'finish'调用并运行'overridePendingTransition'函数,但Android工作室说动画值都是私有的。
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2013-01-25
  • 2016-04-04
  • 1970-01-01
  • 2017-01-25
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多