美文网首页
Arouter 阿里路由框架

Arouter 阿里路由框架

作者: 周大侠侠侠侠侠侠侠侠侠侠侠侠侠 | 来源:发表于2019-07-22 18:00 被阅读0次

    Arouter主要是为了多模块之间的页面跳转和多模块之间的服务共享

    一、添加依赖

    这里需要注意的是kotlin需要使用kapt,并且在每一需要使用Arouter的模块中都需要添加kapt依赖,注意kapt插件的使用

    // 在需要使用Arouter的模块build.gradle中添加kapt
    apply plugin: 'kotlin-kapt'
    
    // 在需要使用Arouter的模块build.gradle中添加
    kapt {
        arguments {
            arg("AROUTER_MODULE_NAME", project.getName())
        }
    }
    
    dependencies {
        // Base模块中添加
        api 'com.alibaba:arouter-api:x.x.x'
        
        // 在需要使用Arouter的模块build.gradle中添加
        kapt 'com.alibaba:arouter-compiler:x.x.x'
        ...
    }
    
    二、添加注解

    在需要跳转的页面中添加Router注解,这里至少需要两级

    @Route(path = "/app/MainActivity")
    public class MainActivity extend AppCompatActivity {
        ...
    }
    

    三、初始化

    在Application中进行初始化,InstantRun模式下必须开始调试模式

    if (Config.isDebug) {           
        ARouter.openLog();     
        ARouter.openDebug();  
    }
    ARouter.init(mApplication); 
    

    四、开始页面跳转

    // 直接跳转
    ARouter.getInstance().build("/app/MainActivity").navigation();
    
    // 携带参数跳转
    ARouter.getInstance().build("/app/MainActivity")
                .withString("name", "jack")
                .withInt("age", 10)
                .navigation();
               
    // 带请求码跳转,在onActivityResult中返回数据
    ARouter.getInstance().build("/app/MainActivity")
                .navigation(activity, requestCode)
    

    五、调用其他模块的服务

    1.在Base模块中添加接口

    interface IUiService : IProvider {
        fun provideData(): String
    }
    

    2.在被调用的模块中实现接口

    @Route(path = RouterPath.Service.UiService)
    class UiService : IUiService {
    
        override fun init(context: Context?) {}
    
        override fun provideData(): String = "服务名${javaClass.simpleName}"
    }
    

    3.在使用模块中找到接口调用

    val message = ARouter.getInstance().navigation(IUiService::class.java).provideData()
    

    六、可能出现的问题

    1.androidx可以用么?
    可以用的,做好androidx的配置 gradle.properties中查看是否有android.enableJetifier=true标志将第三方库转化为使用androidx

    2."W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"

    • 首先是由于都是字符串作为标记,查看是否是 <u>字符串写错了</u>,是否配置了两级目录,一般是自信手打造成的,相信我还是cv操作更为稳妥,或者使用String常量来表示
    • 是否在 <u>每一个需要使用ARouter的模块中添加了kapt的依赖</u>,查看文章标题一,这个是我发现遇到最多的问题
    • 因为都是在多个模块中,那么是不是在使用模块化和插件化的过程中,<u>有没有把该模块依赖到主模块(app模块中)中,例如三个模块app,moduleA,moduleB,moduleA和moduleB都需要依赖到app模块中,这样moduleA和moduleB之间才能相互跳转</u>,觉得真的没问题的时候就是这个问题
    • 开启调试模式,开启日志,运行app,查看ARouter是否发现了目标
      D/ARouter::: The group [app] has already been loaded, trigger by [/app/MainActivity][ ] 没有发现目标,那就还是配置的问题
    • 最后看下是不是真的有这个路径的页面,是否真的注册了,有没有可能手贱删掉了注册中的一个字符,注解是不是@Router,path有没有写等等一些细节
    • 没得救了,加群,问群里的大神

    七、优化一下

    1.使用管理类进行统一管理,由于都是使用字符串作为标记,建议使用常量

    object RouterPath{
        const val MainActivity = "/app/MainActivity"
    }
    
    @Route(path = RouterPath.MainActivity)
    public class MainActivity extend AppCompatActivity {
        ...
    }
    
    object RouterManager{
        @JvmStatic
        fun startMainActivity(name:String){
            ARouter.getInstance().build(RouterPath.MainActivity)
                .withString("name",name)
                .navigation()
        }
    }
    

    相关文章

      网友评论

          本文标题:Arouter 阿里路由框架

          本文链接:https://www.haomeiwen.com/subject/cfxglctx.html