react native - 一些问题的解决总结(二)

1、 android 修改了系统的显示大小之后,再次打开应用会闪退

解决方案:修改此处代码 android/app/src/main/java/xxx/MainActivity.java

@Override

protected void onCreate(Bundle savedInstanceState) {

...

super.onCreate(null);   // 此处将savedInstanceState修改为null

...

}

2、调用patch类型的方法报400错误

解决方案: 把网络请求中Method的类型,从patch改为PATCH

3、从A页面跳转到B页面后,再刷新A页面

正常情况下,从A页面跳转到B页面,在B页面修改了一些数据之后再返回A页面,A页面不会自动刷新,因为此时的props和state都没变化

解决方案:在A页面的componentDidMount生命周期里加监听

A.tsx

componentDidMount(): void {

    subscription: any = null;

    ...

    this.subscription = DeviceEventEmitter.addListener('hpsaDeviceListRefresh', () => {

        ...

    }

...

}

// 记得销毁前移除监听

componentWillUnmount(): void {

    this.subscription && this.subscription.remove();

}

4、android通过包名打开另一个app

Linking.openURL(url) 这种方式在ios上没有问题,打开应用市场也没有问题,通过scheme打开另一个app也可以,但是只有一个包名的情况下,react native无法直接打开另一个app

解决方案: 写原生方法

通过这里我们可以知道react native怎么调用原生里的方法,这里只写原生代码

xxxActivity.java

private final ReactApplicationContext reactContext;

public HpsaMedalliaActivity(ReactApplicationContext context) {

    super(context);

     ...

    this.reactContext = context;

}

// 根据包名检查手机中是否安装了此应用

@ReactMethod

public void checkPackInfo(String packageName, Callback callback) {

    PackageInfo packageInfo = null;

    try {

        packageInfo = this.reactContext.getPackageManager().getPackageInfo(packageName, 0);

        // 回调函数,react native可以传入一个回调函数获取检查结果

        callback.invoke(packageInfo != null);

    } catch (PackageManager.NameNotFoundException e) {

        // 回调函数

        callback.invoke(false);

    }

}

// 通过包名打开应用

@ReactMethod

public void openApplication(String packageName) {

    PackageManager pm = this.reactContext.getPackageManager();

    try {

        this.reactContext.startActivity(pm.getLaunchIntentForPackage(packageName));

    } catch (Exception e) {

        e.printStackTrace();

    }

}


react native代码

NativeModules.xxxActivity.checkPackInfo(packageName, (result) => {

    if (result) {

        NativeModules.xxxActivity.openApplication(packageName);

    } else {

    // 打开应用市场或者其他逻辑

    }

}

你可能感兴趣的:(react native - 一些问题的解决总结(二))