Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

宿主实例化插件的对象,无法转换

Open Daimhim opened this issue 3 years ago • 9 comments

插件和宿主在同一个进程,宿主与插件共同拥有一个基类BaseFragment,宿主通过ARouter实例化插件的Fragment。在宿主无法在强转为BaseFragment。请问一下这种场景需要什么条件

代码大概这样 image

Daimhim avatar Feb 10 '22 08:02 Daimhim

在宿主无法在强转为BaseFragment。

怎么无法?缺少关键信息。

shifujun avatar Feb 10 '22 08:02 shifujun

想在宿主使用插件的fragment,怎么实例化,目前使用的ARouter直接实例化,提示验证报错 image

Daimhim avatar Feb 10 '22 09:02 Daimhim

我这边是打算把fragment实例化出来,然后手动调用其中的生命周期方法,类似代理的方式 ,达到使用fragment的目的 宿主加载壳子,壳子再去实例化插件的fragment

image

Daimhim avatar Feb 10 '22 09:02 Daimhim

你遇到的Crash跟fragment没有关系,是那个fragment类中引用的activity类型所致的。

除此之外,宿主使用插件fragment还需要在资源上在宿主和插件中二选一。因为fragment只能和其attach的activity共用context。

从你的需求来说,完全没必要复用fragment这个官方设计。你可以模仿它的思想自己写一个将activity代码分解的类型,就不会遇到这么多和android系统api的冲突了。

shifujun avatar Feb 10 '22 11:02 shifujun

宿主activity仅展示插件fragment,fragment内部的操作 activity不做干涉。至于资源activity使用宿主的,fragment使用插件的。需求大概是这样 但是fragment怎么实例化 可以达到这个需求

Daimhim avatar Feb 11 '22 01:02 Daimhim

资源activity使用宿主的,fragment使用插件的

这是现在无法做到的。因为Fragment的设计就是跟Activity使用相同Context的,所以它只能使用宿主资源。

因此我才建议你自己定义一个MyFragment接口,模仿Fragment的设计去解耦你的Activity代码到插件中。

Fragment主要关心的是Activity的生命周期以及其他和系统交互的API,对View并不特别干涉。而View本身是可以有独立的Context的。所以宿主中的Activity是可以添加来自插件的View的,这个View可以有自己来自插件的资源。

shifujun avatar Feb 11 '22 01:02 shifujun

我现在是准备吧插件的fragment行为抽象成接口,然后所有的fragment实现抽象 不再继承系统的fragment。在宿主把它当作一个普通的类new出来,传入插件的context 在宿主使用一个空壳fragment转发系统的所有操作 这样可以吗?如果可行那插件的这个类在宿主new时是怎么创建的

Daimhim avatar Feb 11 '22 02:02 Daimhim

应该是可行的,这样做就是把宿主中一个Fragment类的部分代码委托到插件中的普通类,从而动态化了。

宿主获取插件Context,以及宿主获取你定义的普通类,都需要通过控制反转设计,由插件向宿主注入这些类或对象的工厂。就像simple-host-lib中的类那样。

shifujun avatar Feb 11 '22 02:02 shifujun

导致原因是同一个类被插件和宿主的classloader都加载过一遍,导致两个类之间不能互相转换,现在通过过滤指定类达到目的了 可以参考 https://github.com/Tencent/Shadow/issues/807

Daimhim avatar Feb 17 '22 07:02 Daimhim