微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React-Native与Android原生数据通信之回调函数

写作时间:2020/4/8
React-Native版本:0.62.2
Android Studio版本:3.5.2
开发平台:Windows
目标平台:Android

在RN的开发过程中,有时会不可避免地使用原生模块。本文通过利用回调函数实现RN和Android原生之间的通信。实现的结果是在RN界面输入文字之后,将文字发送给原生,原生在收到文字之后对其进行简单处理(添加后缀)再返回给RN界面。如下图所示

在这里插入图片描述

以下是具体操作过程

1 通过react-native init 命令创建一个初始项目(我创建的项目名称为Init),打开项目中的App.js文件,将代码全部删除,换成如下内容

// App.js
import React from 'react';
import {View, Text, TextInput, Button, StyleSheet, NativeModules} from 'react-native';

const NativeModule = NativeModules.MyNativeModule;

export default class App extends React.Component {
    constructor() {
        super();
        this.state = {postText: '', newText: ''};
    }

    render() {
        return (
            <View style={styles.page}>
                <TextInput
                    style={styles.input}
                    placeholder="请输入文字"
                    value={this.state.postText}
                    onChangeText={(text) => this.setState({postText: text})}
                />
                <Button
                    title="提交给原生"
                    onPress={() => {
                        NativeModule.addSuffix(
                            this.state.postText,
                            (msg) => {
                                console.log(msg);
                            },
                            (newText) => {
                                this.setState({newText: newText});
                            },
                        );
                    }}
                />
                <Text>{this.state.newText}</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    page: {
        flex: 1,
        backgroundColor: '#F7F7F7',
        justifyContent: 'space-evenly',
    },
    input: {
        height: 80,
        borderWidth: 1,
        borderColor: '#ddddDD',
    },
});

2 通过Android Studio打开RN工程下的Android项目,在app/java/com/init目录下找到MainApplication.java文件,对文件进行如下修改

修改1

// MainApplication.java

···

// 新添加MyReactPackage包(这个包会在后面创建)
import com.init.MyReactPackage;

···

修改2

// MainApplication.java

···
@Override
protected List<ReactPackage> getPackages() {
    @SuppressWarnings("UnnecessaryLocalVariable")
    List<ReactPackage> packages = new PackageList(this).getPackages();
    
    //找到getPackages方法添加如下语句
    packages.add(new MyReactPackage());
    
    return packages;
}
···

3 在同路径下新建文件,命名为MyNativeModule.java,代码如下

// MyNativeModule.java

package com.init;

import com.facebook.react.bridge.Callback;
import com.facebook.react.uimanager.IllegalViewOperationException;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;

public class MyNativeModule extends ReactContextBaseJavaModule {
    private static ReactApplicationContext context;

    public MyNativeModule(ReactApplicationContext reactContext) {
        super(reactContext);
        context = reactContext;
    }

    @Override
    public String getName() {
        return "MyNativeModule";
    }

    @ReactMethod
    public void addSuffix(String name,Callback errorCallback,Callback successCallback){
        try {
            successCallback.invoke(name + "_native");
        }catch (IllegalViewOperationException e){
            errorCallback.invoke(e.getMessage());
        }
    }
}

4 在相同目录下再创建另一个文件MyReactPackage.java,代码如下

// MyReactPackage.java

package com.init;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MyReactPackage implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new MyNativeModule(reactContext));
        return modules;
    }
}

5 重新执行react-native run-android,成功!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐