Flutter的狂热爱好者,专业人士和未来的朋友。我一直在努力尝试从MainActivity传递MethodChannel.Result到一个新的活动(在那里执行一些工作之后处理结果处理程序)。
在iOS中,我已将FlutterResult填充到具有其他相关值的结构中,并将其传递到新的ViewController中,并已从那里成功运行结果处理程序。
如何在Android中执行此操作?由于结果不可序列化,因此我无法将其添加为意图。
在我的MainActivity中,我正在运行“ setMethodCallHandler”,在适当的call.method情况下,我正在创建一个新的intent并启动它。我已经成功地在新活动中添加和拉出String值,但是我需要传递的是Flutter Result。
实现此目标的推荐方法是什么?我会以错误的方式处理吗?
我问我是否做错了,因为当我完成这个新活动时,有一个半秒的黑屏会接替该活动,而该活动将被关闭。
不确定是否重要,但是我正在用Kotlin写作。我很高兴听到任何Java建议。
谢谢大家。
答案 0 :(得分:1)
在新活动中没有什么确切的背景信息时,很难说清为什么会出现黑屏。从理论上讲,flutter活动应该仍在运行,并且在完成新活动时应该会显示-除非您在UI线程上执行了某些阻止操作。
但是,要传递result
,您想要做的是在收到flutter消息的任何地方都保留对result
处理程序的引用,并利用android的{{ 1}}方法。请参阅getting a result from an activity上的android文档。您的“工作者”活动应做任何需要做的事情,然后在完成之前通过调用startActivityForResult
将结果传回。您传回的数据必须可序列化。
稍微增加了一些皱纹-您不一定要在这里进行自己的活动(如果您仍然在编写插件)。在这种情况下,您需要实现setResult
并在插件的ActivityResultListener
函数中调用registrar.addActivityResultListener
。如果您只是在应用程序中执行此操作,则可以简单地覆盖registerWith
-只需确保调用super,否则可能会破坏其他flutter插件。
对此有另一种可能的解决方案,根据您想深入了解的程度,存在各种不同的漏洞。解决方案是只使用Singleton或Global存储活动之间的需求。 对于那些正在阅读本文的人-我不赞成这样做,我只是提供一种替代方案。需要注意一些注意事项-其中有很多原因,其中包括全局变量和较小范围内的单例是个坏主意,其中包括代码可维护性。如果您绝对必须沿这条路线走,我建议使用注册表模式而不是简单的单例-即您创建一个可序列化的密钥,并使用该密钥将onActivityResult
存储在本质上是全局/单个映射中,并传递键,然后在新活动中使用该键检索值(并确保从地图中删除该对象)。
请注意,如果应用程序被android停止,则global / singleton / registry选项将无法正常运行,因为可以根据其意图重新创建活动,但内存中的对象可能不会持久。再说一遍-颤振回调无论如何都不会持续,因此无论如何这点都没有意义。
如果您在完成新活动后仍然看到黑屏,那听起来更像是一个错误或与新活动的实现有关的事情,而不是抖动问题。