Skip to content

跳转 使用代码跳转

xiaojinzi123 edited this page Nov 6, 2019 · 5 revisions

使用代码路由到其他界面

特别注意

// 这种会默认使用 Application
Router.with()
  		.....
// 注意: 当你想要使用 startActivity 就需要传入 对应的Fragment 或者 Activity,而不可以像
// 上面那样省略不传,如果不是会导致路由失败(不会奔溃)
Router.with(context)
  		......

基础包

基于 uri 的所以直接支持使用 url 跳转

Router
                .with()
                .host("component1")
                .path("main")
                .url("router://component1/main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .forward();

普通跳转

这段就跳转到上面我们写的那个例子的界面中了,并且我们还传了两个 String 值过去哦

Router
                .with()
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .forward();

普通跳转Bundle带值

这段就跳转到上面我们写的那个例子的界面中了,我们传了两个 String 值,并且额外存了两个值到 Bundle 中携带过去,和我们普通的传值效果是一样的,唯一的区别是 路由的 putXXX 方式利用方法名区别传不同的值, Intent 靠重载方法来传不同的值,但是我更倾向于利用方法区分,因为一旦你入参的参数类型有改动的时候,方法就会报错,而 Intent 不会 Intent intent = new Intent(Context,XXX.class); intent.putExtra(key,value);

Router
                .with()
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
		.putString("name", "cxj1")
                .putInt("age", 25)
                .forward();

普通跳转判断是否跳转成功

Router.with()
               .host("component1")
               .path("main")
               .putString("name", "cxj")
               .putString("pass", "123")
               .forward(new CallbackAdapter() {
                        @Override
                        public void onSuccess(@NonNull RouterResult result) {
                                // 跳转成功,参数是 request 对象
                        }

                        @Override
                        public void onError(@NonNull Exception error) {
                                // 跳转失败,参数是 Exception 对象
                        }
                });

普通跳转成功和失败

Router.with()
               .host("component1")
               .path("main")
               .putString("name", "cxj")
               .putString("pass", "123")
               .forward(new CallbackAdapter() {
                        @Override
                        public void onEvent(@Nullable RouterResult routerResult, @Nullable Exception error) {
                                // 跳转成功,参数是 request 对象
                        }
                });

这种就是成功和失败都能从一个方法中拿到

普通跳转拿数据

Router
								// 这时候必须传入 Activity 的 Context 对象
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456) // requestCode
                .forward();

你就可以在 onActivityResult 方法中拿到数据啦,这种方式和原生的写法没什么差别,骚操作且看下面

跳转拿 ActivityResult 数据

Router
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456) // requestCode
                .forwardForResult(new BiCallback.BiCallbackAdapter<ActivityResult>() {
                    @Override
                    public void onSuccess(@NonNull RouterResult result, @NonNull ActivityResult activityResult) {
                        super.onSuccess(result, activityResult);
                        // 你就拿到了 ActivityResult
                    }
                });

跳转拿 Intent 数据

Router
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456) // requestCode
                .forwardForIntent(new BiCallback.BiCallbackAdapter<Intent>() {
                    @Override
                    public void onSuccess(@NonNull RouterResult result, @NonNull Intent intent) {
                        super.onSuccess(result, intent);
                        // 你就拿到了 Intent
                    }
                });

跳转拿 Intent 数据并且匹配 resultCode(Activity.RESULT_OK)

Router
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456) // requestCode
                .forwardForIntentAndResultCodeMatch(new BiCallback.BiCallbackAdapter<Intent>() {
                    @Override
                    public void onSuccess(@NonNull RouterResult result, @NonNull Intent intent) {
                        super.onSuccess(result, intent);
                        // 你就拿到了 Intent
                    }
                },Activity.RESULT_OK);

rx包

rx 库只是基于基础包支持了 RxJava2,所以上述的方式都能转化成为 Observable 的方式,具体看下面的演示吧

最普通的跳转

// 这里返回的 Completable 你可以结合 RxJava 嵌入整体流程中
Completable completable = RxRouter.with()
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .call();
completable.subscribe();

Rx方式跳转拿数据

RxRouter
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456)
                .newIntentCall()
                .subscribe(new Consumer<Intent>() {
                    @Override
                    public void accept(Intent intent) throws Exception {
                        // intent 参数中拿数据
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        // 你可以自己处理错误,如果不传入 错误的回调接口,默认忽略
                    }
                });

这种方式可以说很明显减少了平常写的代码的量,并且让你摆脱了 onActivityResult,所以这可以在** Adapter 或者 任何一个有 Context(其实是一个Activity)的地方去使用** 上述的写法是要处理错误,如果你不想处理错误,可以这样写

RxRouter
                .with(this)
                .host("component1")
                .path("main")
                .putString("name", "cxj")
                .putString("pass", "123")
                .requestCode(456)
                .newIntentCall()
                .subscribe(new Consumer<Intent>() {
                    @Override
                    public void accept(Intent intent) throws Exception {
                        // intent 参数中拿数据
                    }
                });

Rx 方式和其他操作组合

因为上面的使用你都是拿到一个 Single Observable,所以你可以拿着这个 Observable 和其他的任何流程进行结合使用 完美的嵌入到一个流程中,不会被 onActivityResult 等方式打断你的流程

路由请求的自动取消(支持Activity和Fragment)

Router
                .with(this)
                .host(ModuleConfig.System.NAME)
                .path(ModuleConfig.System.CALL_PHONE)
                .interceptors(DialogShowInterceptor.class)
                .navigate(new CallbackAdapter() {
                    @Override
                    public void onEvent(@Nullable RouterResult result, @Nullable Exception error) {
                        super.onEvent(result, error);
                    }

                    @Override
                    public void onCancel() {
                        super.onCancel();
                    }
                });

        finish();

当销毁这个Actiivty的时候,路由请求如果还没有跳转过去,比如因为中间的拦截器等因素,那么就会自动取消这个路由请求

RxRouter
                .withFragment(this)
                .host(ModuleConfig.System.NAME)
                .path(ModuleConfig.System.CALL_PHONE)
                .interceptors(DialogShowInterceptor.class)
                .navigate(new CallbackAdapter(){
                    @Override
                    public void onEvent(@Nullable RouterResult result, @Nullable Exception error) {
                        super.onEvent(result, error);
                    }

                    @Override
                    public void onCancel() {
                        super.onCancel();
                    }
                });

        getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

当销毁这个Fragment的时候,路由请求如果还没有跳转过去,比如因为中间的拦截器等因素,那么就会自动取消这个路由请求

跳转前后可以执行的Action

Router
                .with(this)
                .host(ModuleConfig.System.NAME)
                .path(ModuleConfig.System.CALL_PHONE)
                .onBeforJump(new xiaojinzi.component.support.Action() {
                    @Override
                    public void run() throws Exception {
                        Toast.makeText(mContext, "startActivity之前", Toast.LENGTH_SHORT).show();
                    }
                })
                .onAfterJump(new xiaojinzi.component.support.Action() {
                    @Override
                    public void run() throws Exception {
                        Toast.makeText(mContext, "startActivity之后", Toast.LENGTH_SHORT).show();
                    }
                })
                .navigate();
You can’t perform that action at this time.