Skip to content

跳转 接口路由的方式

xiaojinzi123 edited this page Jun 26, 2019 · 3 revisions

前言

每一个路由跳转都可以使用接口声明的方式去描述,然后使用特定的方式就可以达到路由的功能

接口路由的好处

显式的声明了一个方法去描述如果路由到某一个界面.

好处

  • 就是对同一个界面的跳转都可以用一个接口去跳转,可控度增加了,维护变得简单

坏处

  • 就是你需要把这个接口的声明下沉到 BaseModule.相比每一处跳转自己去写来说,这种方式增加了 BaseModule 的负担

如何抉择

目前此方案中两种方案都是完全支持的,后续也会一直支持下去.但是两种方式在你们项目中的使用需要你们自己去估量你们自己的团队更倾向于哪一种方式

如何使用

各个路由接口的注解解释请移步 --> 路由接口注解说明

声明一个 App 接口,声明一个最简单的跳转

Retrofit 一样,创建一个接口 App.class,然后在内部用方法去描述一个路由
然后使用 @RouterApiAnno() 注解标记这个接口,这一步不能少

@RouterApiAnno()
public interface App {
      // 声明一个接口描述跳转到登录界面
      // @HostAndPathAnno 等同于 @HostAnno + @PathAnno
      @HostAndPathAnno("user/login")
      void toLoginView(Context context);
}

如何跳转过去

// 执行跳转
Router.withApi(App.class).toLoginView(this);

高级使用

接口声明中几个内置的参数

  1. 参数
    • Context
    • Fragment
    • Callback
    • BiCallback
  2. 返回值
    • NavigationDisposable
    • Call
    • Navigator

上述这些参数是框架自己能解析到的,其他参数都需要使用对应的注解来告诉框架

想收到跳转回调怎么做?

@RouterApiAnno()
public interface App {
      // 增加一个 Callback 就 ok 了
      @HostAndPathAnno("user/login")
      void toLoginView(Context context,Callback back);
}

想取消这个路由怎么做?

@RouterApiAnno()
public interface App {
      // 返回值写 NavigationDisposable 
      @HostAndPathAnno("user/login")
      NavigationDisposable toLoginView(Context context,Callback back);
}

想获取 ActivityResult 怎么做?

@RouterApiAnno()
public interface App {
      // 回调改成 BiCallback<ActivityResult>
      // 添加上 @NavigateAnno(forResult = true) 表示本次路由是为了 `ActivityResult`
      // 不要忘记添加 @RequestCodeAnno() 表示会自动会为本次路由生成一个可用的requestCode
      @NavigateAnno(forResult = true)
      @RequestCodeAnno()
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<ActivityResult> back);
}

想获取 Intent 怎么做?

@RouterApiAnno()
public interface App {
      // 回调改成 BiCallback<Intent>
      // 添加上 @NavigateAnno(forIntent = true) 表示本次路由是为了 `Intent`
      // 不要忘记添加 @RequestCodeAnno() 表示会自动会为本次路由生成一个可用的requestCode
      @NavigateAnno(forIntent = true)
      @RequestCodeAnno()
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<Intent> back);
}

想获取 resultCode 怎么做?

@RouterApiAnno()
public interface App {
      // 回调改成 BiCallback<Integer>
      // 添加上 @NavigateAnno(forResultCode = true) 表示本次路由是为了 `Integer`
      // 不要忘记添加 @RequestCodeAnno() 表示会自动会为本次路由生成一个可用的requestCode
      @NavigateAnno(forResultCode = true)
      @RequestCodeAnno()
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<Integer> back);
}

想获取 Intent 的同时匹配 resultCode 怎么做?

@RouterApiAnno()
public interface App {
      // 回调改成 BiCallback<Intent>
      // 添加上 @NavigateAnno(forIntent = true) 表示本次路由是为了 `Intent`
      // resultCodeMatch表示本次路由会匹配 resultCode 为Activity.RESULT_OK
      // 不要忘记添加 @RequestCodeAnno() 表示会自动会为本次路由生成一个可用的requestCode
      @NavigateAnno(forIntent = true, resultCodeMatch = Activity.RESULT_OK)
      @RequestCodeAnno()
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<Intent> back);
}

只想匹配 resultCode 怎么做?

@RouterApiAnno()
public interface App {
      // 回调改成 Callback
      // 添加上 @NavigateAnno(resultCodeMatch = Activity.RESULT_OK) 表示本次路由会匹配 resultCode 为Activity.RESULT_OK
      // 不要忘记添加 @RequestCodeAnno() 表示会自动会为本次路由生成一个可用的requestCode
      @NavigateAnno(resultCodeMatch = Activity.RESULT_OK)
      @RequestCodeAnno()
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<Intent> back);
}

想使用特定的 requestCode 怎么做?

@RouterApiAnno()
public interface App {
      // @RequestCodeAnno(123) 表示会自动会为本次路由使用 `123` 的requestCode
      @NavigateAnno(forIntent = true)
      @RequestCodeAnno(123)
      @HostAndPathAnno("user/login")
      void toLoginView(Context context, BiCallback<Intent> back);
}

requestCode 想通过参数传递怎么做?

@RouterApiAnno()
public interface App {
      // @RequestCodeAnno() 标记 `int` or `Integer` 参数即可
      @NavigateAnno(forIntent = true)
      @HostAndPathAnno("user/login")
      void toLoginView(
            Context context, 
            @RequestCodeAnno() int requestCode, 
            BiCallback<Intent> back
      );
}

想统一设置某个接口的所有方法的 host 怎么做?

@RouterApiAnno()
@HostAnno("user")
public interface App {
      // 声明一个接口描述跳转到登录界面
      @PathAnno("login")
      void toLoginView(Context context);
}

统一设置某个接口的所有方法的 host 但是想设置某个方法的 host 怎么做?

@RouterApiAnno()
@HostAnno("app")
public interface App {
      // 使用 @HostAndPathAnno() 或者 @HostAnno() + @PathAnno()
      @HostAnno("user")
      @PathAnno("login")
      void toLoginView(Context context);
}

不想调用了方法就执行本次路由,想自己决定什么时候调用怎么办?

@RouterApiAnno()
public interface App {
      // 返回值改成 Call 就可以了,调用了方法不会执行路由,需要你拿到 Call 对象自行调用
      // 注意不能和 @NavigateAnno 注解混合使用,因为两者含义冲突
      @HostAndPathAnno("user/login")
      Call toLoginView(Context context);
}

想传递其他的参数类型怎么做?

目前支持的全部参数类型都在下面了

@PathAnno("test")
void test1(Context context,
               @ParameterAnno("data1") String data1,
               @ParameterAnno("data2") byte data2,
               @ParameterAnno("data3") short data3,
               @ParameterAnno("data4") int data4,
               @ParameterAnno("data5") long data5,
               @ParameterAnno("data6") float data6,
               @ParameterAnno("data7") double data7,
               @ParameterAnno("data8") User data8,
               @ParameterAnno("data9") Parcelable data9,
               @ParameterAnno("data10") Serializable data10,
               @ParameterAnno("data11") CharSequence data11,
               @ParameterAnno("data12") Bundle data12,
               @ParameterAnno("data13") ArrayList<String> stringArrayList,
               @ParameterAnno("data14") ArrayList<Integer> integerArrayList,
               @ParameterAnno("data15") ArrayList<Parcelable> parcelableArrayList,
               @ParameterAnno("data16") ArrayList<CharSequence> charSequenceArrayList,
               @ParameterAnno("data17") byte[] data17,
               @ParameterAnno("data18") char[] data18,
               @ParameterAnno("data19") String[] data19,
               @ParameterAnno("data20") short[] data20,
               @ParameterAnno("data21") int[] data21,
               @ParameterAnno("data22") long[] data22,
               @ParameterAnno("data23") float[] data23,
               @ParameterAnno("data24") double[] data24,
               @ParameterAnno("data25") boolean[] data25,
               @ParameterAnno("data26") Parcelable[] data26,
               @ParameterAnno("data27") CharSequence[] data27,
               Bundle data28
);
You can’t perform that action at this time.