Arouter 阿里路由框架

2019-07-22  本文已影响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][ ]"

七、优化一下

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()
    }
}
上一篇下一篇

猜你喜欢

热点阅读