Android 组件化+ARouter 开发之路
目录
1⃣️、ARouter 框架通讯:MainModule通过IProvider获取某个类的对象
方法一: 依赖@Autowired注解来获取这个provider
本文主要做一个记录,搭建组件化+ARouter+MVP 框架过程中遇到的一些问题
一、参考资料
1、https://www.jianshu.com/p/8098961bd30c
3、https://blog.csdn.net/hexingen/article/details/80299447
4、https://blog.csdn.net/jobo199501/article/details/94387412
以上文章有好有坏,也有几处不全的地方,所以想学习组件化 需要多看几篇文章,不要让一个人的文章限制了你的思维
当然,实际开发中也不只看了上面几篇文章,但是上面几个文章相对质量比较好,我是参考第三个链接,再根据其他文章综合考虑做的方案。
二、使用
1⃣️、ARouter 框架通讯:MainModule通过IProvider获取某个类的对象
例如获取某个Fragment
Main Module中的代码(提供者接口类)
import com.alibaba.android.arouter.facade.template.IProvider;
public interface LaundryLibPrivoder extends IProvider {
Fragment creatFragment();
}
在目标Module 中写代码 RouterPath.GET_LAUNDRY_LIB_LAUNDRY_FRAGMENT 是一个自定义路径,
@Route(path= RouterPath.GET_LAUNDRY_LIB_LAUNDRY_FRAGMENT)
public class LaundryLibPrivoderImpl implements LaundryLibPrivoder {
@Override
public Fragment creatFragment() {
LaundryListFragment fragment = LaundryListByDeviceTypeFragment.newInstance(null);
return fragment;
}
@Override
public void init(Context context) {
}
}
在MainModule中调用
方法一: 依赖@Autowired注解来获取这个provider
记得inject 方法尽早调用,并且不要在inject调用之后直接马上调用@Autowired注解的对象 ,有可能会报空指针
public class AppHomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private static final String TAG = "AppHomeActivity";
@Autowired
LaundryLibPrivoder movieListProvider;
public static void startAppHomeActivity(Activity context) {
Intent intent = new Intent(context, AppHomeActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ARouter.getInstance().inject(this);
findViewById(R.id.bt_jump_washer_list).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = movieListProvider.creatFragment();
getSupportFragmentManager().beginTransaction().add(R.id.fly_laundry_list, fragment).commit();
}
});
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
return false;
}
}
方法二: 通过Arouter反射获取
Fragment fragment = ARouter.getInstance().navigation(LaundryLibPrivoder.class).creatFragment();
2⃣️、跨module的页面跳转
方法一:通过路径直接跳转
Postcard postcard = ARouter.getInstance().build(path).postcard.navigation();
方法二:通过Uri跳转
<application >
<activity android:name=".view.activity.LaundryShopListActivity">
<!-- Schame -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="**.**.com"//把**替换成你想要的名字
android:scheme="arouter" />
</intent-filter>
</activity>
</application>
Uri testUriMix = Uri.parse("arouter://**.**.com"+RouterPath.TO_LAUNDRY_LIB_SHOP_LIST);
ARouter.getInstance().build(testUriMix)
.withString("key1", "value1")
.navigation();
以上两种方式都需要在目标界面添加路径
@Route(path = RouterPath.TO_LAUNDRY_LIB_SHOP_LIST)
public class LaundryShopListActivity extends AppCompatActivity {}
三、问题记录
上面 链接<参考资料 4> 里面挺全的。
一:ARouter传值失败
传值失败参考https://blog.csdn.net/sinat_31057219/article/details/100983169
大致意思就是:接受的一方如果使用@Autowired进行传值的,则需要注意 字段名称与参数Key相同,并且尽量初始化(不初始化有可能接受不到值)
本文地址:https://blog.csdn.net/JiaoJunfeng/article/details/108579844