使用runtime 实现weex 跳转原生页面

所属分类: 软件编程 / Android 阅读数: 22
收藏 0 赞 0 分享

一、简述

  最近项目组打算引入weex,并选定了一个页面进行试水。页面很简单,主要是获取数据渲染页面,并可以跳转到指定的页面。跟之前使用RN 相比,weex 确实要简单很多。从下图中我们可以看到,weex 页面需要跳转到原生页面,并且跳转到哪个页面我们可能并不能写死。也就是说只要原生页面之前项目中写过了,那么理论上来说使用weex 可以任意调用。那么问题来了,我原来的页面可能只知道名字,我怎么为那个页面传值呢?比如有个页面orderDetailVC  ,跳转时需要传入orderId,即orderDetailVC.orderId = @"123";

二、思考

  可能最直接的想法就是直接原生给weex 提供一个方法,让weex 传入orderId,然后再push。但是如果明天我们需要跳转到另一个页面merchantDetailVC呢?它需要的不是orderId了,可能是一个merchantId,甚至更多参数。那怎么才能实现任意跳转呢?我的想法是,项目是我写的,需要跳转到哪个类,那么这个类名我肯定是清楚的,并且这个类应该需要什么参数我也是清楚的。只不过我可能不知道怎么用weex 把它参数传过去而已。如果知道了类名就意味着我知道了这个类,我能找到这个类,那么我就知道这个类有哪些属性了,这个类的所有属性我都能拿到,只不过有些是我需要给它赋值的,有些是不需要处理的。

三、实现

  整体的思路是:原生给weex 提供一个通用的跳转方法。参数是类名和属性字典。

//控制器相关
/*
 vcName: 页面名称
 param:页面所需参数(如原来的页面需要传递小区id,工单号等等,字典形式传过去,key 与页面所需参数名称一致即可。
 */
-(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param;
/*
 将APP 当前展示的页面pop
 */
-(void)popViewController;
/*
 vcName: 页面名称
 param:页面所需参数(如原来的页面需要传递小区id,工单号等等,字典形式传过去,key 与页面所需参数名称一致即可。
 */
-(void)presentViewController:(NSString *)vcName param:(NSDictionary *)param finish:(WXModuleCallback)callback;
/*
 将APP 当前展示的页面dismiss
 */
-(void)dismissViewController:(WXModuleCallback)callback;

 提供方法后weex 可以这样调用:

确定了方案之后,剩下唯一的事情就是如何实现给weex 提供的方法。代码如下:

-(void)pushViewController:(NSString *)vcName param:(NSDictionary *)param{
  //获取类
  Class vcClass = NSClassFromString(vcName);
  if (vcClass == nil) {
    return;
  }
  BaseViewController *vc = [[vcClass alloc] init];
  vc.hidesBottomBarWhenPushed = YES;
  //属性数量
  unsigned int count = 0;
  //获取属性列表
  objc_property_t *plist = class_copyPropertyList(vcClass, &count);
  for (int i = 0; i<count; i++) {
    //取出属性
    objc_property_t property = plist[i];
    //取出属性名称
    NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
    //以这个属性名称作为key ,查看传入的字典里是否有这个属性的value
    if (param[propertyName]) {
      [vc setValue:param[propertyName] forKey:propertyName];
    }
  }
  //释放
  free(plist);
  //获取当前页面控制器
  /*
   获取当前页面控制器是根据响应链获取的。
   */
  UIViewController *currentVC = [Utils getCurrentVC];
  if ([currentVC isKindOfClass:[UINavigationController class]]) {
    [(UINavigationController *)currentVC pushViewController:vc animated:YES];
  }else{
    [currentVC.navigationController pushViewController:vc animated:YES];
  }
}

 经过小规模自测发现是可以实现需求的。但是由于实现时间不长,可能会有不足之处,请谨慎参考。如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

老生常谈Android HapticFeedback(震动反馈)

下面小编就为大家带来一篇老生常谈Android HapticFeedback(震动反馈)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详谈OnTouchListener与OnGestureListener的区别

下面小编就为大家带来一篇详谈OnTouchListener与OnGestureListener的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android仿知乎悬浮功能按钮FloatingActionButton效果

前段时间在看属性动画,恰巧这个按钮的效果可以用属性动画实现,下面通过本文给大家分享adroid仿知乎悬浮功能按钮FloatingActionButton效果,需要的朋友参考下吧
收藏 0 赞 0 分享

解决Android V7后自定义Toolbar、ActionBar左侧有空白问题

这篇文章主要介绍的Android V7后自定义Toolbar、ActionBar左侧有空白问题的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android常见控件使用详解

这篇文章主要为大家详细介绍了Android常见控件的使用方法,包括ProgressBar进度条控件、AlertDialog对话框控件等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android实现简洁的APP更新dialog数字进度条

这篇文章主要为大家详细介绍了Android实现简洁的APP更新dialog数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 判断当前语言环境是否是中文环境

本文主要介绍了Android 判断当前语言环境是否是中文环境的方法。具有很好的参考价值。下面跟着小编一起来看下吧
收藏 0 赞 0 分享

详谈Android中Matrix的set、pre、post的区别

下面小编就为大家带来一篇详谈Android中Matrix的set、pre、post的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现登录界面记住密码的存储

这篇文章主要为大家详细介绍了Android SharedPreferrences实现登录界面记住密码的存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android 使用SharedPreferrences储存密码登录界面记住密码功能

Android存储方式有很多种,在这里所用的存储方式是SharedPreferrences, 其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,下面通过实例代码给大家讲解下,需要的朋友参考下吧
收藏 0 赞 0 分享
查看更多