Android 组件化+ARouter 开发之路

目录

一、参考资料

二、使用

1⃣️、ARouter 框架通讯:MainModule通过IProvider获取某个类的对象

方法一: 依赖@Autowired注解来获取这个provider

方法二: 通过Arouter反射获取

方法三:通过路径获取

2⃣️、跨module的页面跳转

方法一:通过路径直接跳转

方法二:通过Uri跳转

三、问题记录

一:ARouter传值失败

二:ARouter::Compiler >>> No module name


本文主要做一个记录,搭建组件化+ARouter+MVP 框架过程中遇到的一些问题

一、参考资料

1、Android ARouter:最简单&粗暴(使用与原理)讲解 - 简书

2、浅谈Android组件化

3、Android组件化+Arouter通讯_新根的博客-CSDN博客_android组件化通信原理

4、ARouter使用之坑_JoBoJun的博客-CSDN博客

以上文章有好有坏,也有几处不全的地方,所以想学习组件化 需要多看几篇文章,不要让一个人的文章限制了你的思维

当然,实际开发中也不只看了上面几篇文章,但是上面几个文章相对质量比较好,我是参考第三个链接,再根据其他文章综合考虑做的方案。

二、使用

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();

方法三:通过路径获取

 Fragment fragment =  ARouter.getInstance().navigation(“path/path”).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传值失败

 传值失败参考ARouter 传值失败_Mars-xq的博客-CSDN博客_arouter 传参

大致意思就是:接受的一方如果使用@Autowired进行传值的,则需要注意 字段名称与参数Key相同,并且尽量初始化(不初始化有可能接受不到值)

二:ARouter::Compiler >>> No module name

参考资料ARouter::Compiler >>> No module name解决办法_GoAndSeeSee的博客-CSDN博客 大多数同类型问题都可以通过这个解决

遇到这个问题,说实话并不难,但是我的问题跟大家的问题并不相同,我各种查资料各种试探,就是解决不了这个问题,最后灵机一动,想起有一个组件没有build

项目编译文件

于是在每个module的build.gradle中都写上以下代码,

 defaultConfig { 
javaCompileOptions {
            //编译时注解处理器
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
}

然后单独编译了那个没有build文件夹的module,具体的方法就是

w

 然后在dependencies中把该加的引用加上,例如:当前要运行的库的代码关联库(这样就不会出现没有日志的崩溃了)

implementation project(':***Lib')
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值