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 {
// 打开应用市场或者其他逻辑
}
}