Giter Club home page Giter Club logo

Comments (10)

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

我尝试自定义了一个CustomBrowserMatcher,在init之后注册,并且优先级高于BrowserMatcher的0

Router.initialize(this, debug);
        Router.registerMatcher(new CustomBrowserMatcher(1));
public class CustomBrowserMatcher extends AbsMatcher {

    public CustomBrowserMatcher(int priority) {
        super(priority);
    }

    @Override
    public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
        return !this.isEmpty(route) && (uri.toString().toLowerCase().startsWith("http://") || uri.toString().toLowerCase().startsWith("https://"));
    }

    @Override
    public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
        if (target != null && Activity.class.isAssignableFrom(target)) {
            Intent intent = new Intent(context, BrowserActivity.class);
            BrowserParam browserParam = new BrowserParam();
            browserParam.setUrl(uri.toString());
            Bundle bundle=new Bundle();
            bundle.putSerializable("browser", browserParam);
            intent.putExtras(bundle);
            return intent;
        } else {
            return null;
        }
    }
}

现在的情况确实先被这个CustomBrowserMatcher捕获,但是产生了两个新疑问:

  1. 居然被一个未在任何地方加入的RouteInterceptor拦截了
  2. generate方法中无法获取到跳转时候传入的参数

from router.

chenenyu avatar chenenyu commented on July 23, 2024
  1. 可以继承自BrowserMatcher或者AbsImplicitMatcher, AbsMatcher有两个子类:AbsExplicitMatcher处理显式Intent,AbsImplicitMatcher处理隐式Intent,如果不继承自AbsImplicitMatcher,会被当成显式的情况,会走拦截器的逻辑,这块我会考虑能不能优化。
  2. generate专注与处理目标对象的生成,不操作跳转参数,你可以在match方法内操作RouteRequest,比如routeRequest.setXXX

from router.

chenenyu avatar chenenyu commented on July 23, 2024

问题1的出现原因参考这块代码

from router.

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

谢谢
我改为继承自BrowserMatcher以后,问题1解决了。
但是问题2还是有疑问,generate专注于目标对象的生产,目标对象我希望跳转到自定义的BrowserActivity,然后在generate中生成跳转intent,但是在generate中只有uri,没有其他的router.build的时候with的参数,请教一下,我要怎么操作,才可以在我的目标BrowserActivity中获取到with的参数?

@Override
    public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
        //return super.generate(context, uri, target);
        if (target != null && Activity.class.isAssignableFrom(target)) {
            Intent intent = new Intent(context, BrowserActivity.class);
            BrowserParam browserParam = new BrowserParam();
            browserParam.setUrl(uri.toString());
            Bundle bundle = new Bundle();
            bundle.putSerializable("browser", browserParam);
            intent.putExtras(bundle);
            return intent;
        } else {
            return null;
        }
    }

from router.

chenenyu avatar chenenyu commented on July 23, 2024

你不需要操作bundle,什么也不需要做,在生成intent之后,会自动把bundle传入intent内,在目标页面直接获取即可。参见这里

from router.

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

收到,多谢指导。

from router.

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

先贴上我自定义的CustomBrowserMatcher

public class CustomBrowserMatcher extends BrowserMatcher {

    public CustomBrowserMatcher(int priority) {
        super(priority);
    }

    @Override
    public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
        return super.match(context, uri, route, routeRequest);
    }

    @Override
    public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
        return target != null && Activity.class.isAssignableFrom(target) ? new Intent(context, BrowserActivity.class) : null;
    }
}

我再App中做了注册

init router
        Router.initialize(new Configuration.Builder()
                .setDebuggable(BuildConfig.DEBUG)
                .registerModules("app")
                .build());
        Router.registerMatcher(new CustomBrowserMatcher(1));

以上代码再1.3.x中是正常工作的,最近升级到1.4.0,发现对于http的跳转不起作用了,debug发现在CustomBrowserMatcher.generate中target是null

from router.

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

1.3.3同样存在问题
1.3.2正常工作

from router.

chenenyu avatar chenenyu commented on July 23, 2024

BrowserMatcher继承自AbsImplicitMatcher(即只处理隐式intent),隐式Matcher里的target都为null,代码逻辑在,所以你需要把你的自定义Matcher改为继承AbsExplicitMatcher或者它的子类(显式处理器才能接收到target),注意协调好Matcher的优先级问题。抱歉给你带来的困扰。

from router.

zhangchaoxu avatar zhangchaoxu commented on July 23, 2024

非常感谢,贴上正常工作后的代码

public class CustomBrowserMatcher extends AbsExplicitMatcher {

    public CustomBrowserMatcher(int priority) {
        super(priority);
    }

    @Override
    public boolean match(Context context, Uri uri, @Nullable String route, RouteRequest routeRequest) {
        return (uri.toString().toLowerCase().startsWith("http://") || uri.toString().toLowerCase().startsWith("https://"));
    }

    @Override
    public Object generate(Context context, Uri uri, @Nullable Class<?> target) {
        return super.generate(context, uri, BrowserActivity.class);
    }
}

from router.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.