美文网首页
Native - RN 互跳

Native - RN 互跳

作者: iWander | 来源:发表于2019-01-08 10:32 被阅读0次

    1、在我们刚学习rn的时候,官方提供给我们一个简单的demo,实现了native跳转RN页面

      NSURL *jsCodeLocation;
      
      jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
      
      RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                          moduleName:@"SecondProject"
                                                   initialProperties:nil
                                                       launchOptions:nil];
      
       UIViewController *reactNativeVC = [UIViewController new];
      reactNativeVC.view = rootView;
    //  reactNativeVC.title = @"cnode";
      [self.navigationController setNavigationBarHidden:YES animated:YES];
      [self.navigationController pushViewController:reactNativeVC animated:YES];
    

    就这么一段代码就ok了。

    2、那么RN页面怎么跳回native页面呢,下边咱们代码实现以下

    因为以前是搞iOS的,所以对iOS代码比较熟悉一些,就先拿OC代码来实现以下

    • 先写OC部分的代码
      要实现rn与native的交互,我们看到项目中依赖的三方库中有<React/RCTBridgeModule.h> bridge很明显‘桥’的意思。要实现rn页面跳转到native页面,咱们就需要用到这个类了。首先创建一个继承自NSObject的类,然后我们遵循RCTBridgeModule 协议。
    #import <Foundation/Foundation.h>
    #import <React/RCTBridgeModule.h>
    
    @interface OpenNativeModule : NSObject<RCTBridgeModule>
    
    @end
    
    
    #import "OpenNativeModule.h"
    #import "AppDelegate.h"
    #import "NativeViewController.h"
    
    @implementation OpenNativeModule
    
    RCT_EXPORT_MODULE();
    
    RCT_EXPORT_METHOD(openNativeVC:(NSString *)tag) {
      switch ([tag integerValue]) {
        case 1:
          dispatch_async(dispatch_get_main_queue(), ^{
            AppDelegate *delegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
            UINavigationController *rootNav = delegate.navC;
            NativeViewController *nativeVC = [[NativeViewController alloc] init];
            [rootNav pushViewController:nativeVC animated:YES];
          });
          break;
          
        case 2:
          dispatch_async(dispatch_get_main_queue(), ^{
            AppDelegate *delegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
            UINavigationController *rootNav = delegate.navC;
            NativeViewController *nativeVC = [[NativeViewController alloc] init];
            [rootNav pushViewController:nativeVC animated:YES];
          });
          break;
        default:
          break;
      }
    }
    @end
    
    • react-native 代码
    export default class NavigatorIOSExample extends Component {
    
        _jumpToNative=()=>{
            nativeModule.openNativeVC('1')
        }
        render() {
            return (
                // <NavigatorIOS
                //     initialRoute={{
                //         component: MyScene,
                //         title: 'My Initial Scene',
                //         passProps: { title: 'test' },
                //     }}
                //     style={{ flex: 1 }} />
    
                <TouchableHighlight onPress={this._jumpToNative}>
                    <Text style={{marginTop:64}}>这里是跳转native的</Text>
                </TouchableHighlight>
            )
        }
    }
    
    • Android代码 没有进行验证,从网上找的
    1. 定义Module类,继承ReactContextBaseJavaModule
      在Module类中,重写getName方法声明Module类名称,创建我们自己的方法用来做页面跳转。

    2. 定义Package类,实现接口ReactPackage
      Package类需要实现createNativeModules和createViewManagers两个方法。在createNativeModules中初始化Module类并添加到集合

    3. 定义Application类,继承android的Application,并实现ReactApplication接口。
      在getPackages方法中初始化Package类,并添加到集合。

    RN项目创建的时候Application类就有了,不需要再创建。如果是集成到现有原生项目,就需要手动修改Application类。

    // Module类核心代码:
    public class OpenNativeModule extends ReactContextBaseJavaModule {
     
        private ReactContext mReactContext;
     
        public OpenNativeModule(ReactApplicationContext context) {
            super(context);
            this.mReactContext = context;
        }
     
        @Override
        public String getName() {
            return "OpenNativeModule";
        }
     
        @ReactMethod
        public void openNativeVC() {
            Intent intent = new Intent();
            intent.setClass(mReactContext, SettingsActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mReactContext.startActivity(intent);
        }
    }
    
    // Package类核心代码:
    public class TestReactPackage implements ReactPackage {
     
        @Override
        public List<NativeModule> createNativeModules(
                ReactApplicationContext reactContext) {
            List<NativeModule> modules = new ArrayList<>();
            modules.add(new OpenNativeModule(reactContext));
            return modules;
        }
     
        @Override
        public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
            return Collections.emptyList();
        }
    }
    
    // Application类核心代码:
    @Override
        protected List<ReactPackage> getPackages() {
          return Arrays.<ReactPackage>asList(
              new MainReactPackage(),
              new VectorIconsPackage(),
              new TestReactPackage()
          );
        }
    
    

    更多详细还可以参考RN与原生交互(一)——基本页面跳转、简书RN笔记-RN跳转原生及数据传递

    相关文章

      网友评论

          本文标题:Native - RN 互跳

          本文链接:https://www.haomeiwen.com/subject/aghvrqtx.html