Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
React native 布局在React Native中显示方向错误(使用Expo)_React Native_Expo_Right To Left - Fatal编程技术网

React native 布局在React Native中显示方向错误(使用Expo)

React native 布局在React Native中显示方向错误(使用Expo),react-native,expo,right-to-left,React Native,Expo,Right To Left,我用Expo在React native中开发了一个应用程序。。当我在android模拟器和手机上测试时,一切都很好。。但是,当我将APK交给其他人为我测试时,出现了一个问题。。RTL电话的布局是相反的。。我在App.js(根文件)的构造函数中编写了这两行代码来解决这个问题 I18nManager.allowRTL(false); I18nManager.forceRTL(false); 但是,此解决方案仅在应用程序第二次启动时有效,而在应用程序第一次启动时不起作用(这会给人留下很坏的印象

我用Expo在React native中开发了一个应用程序。。当我在android模拟器和手机上测试时,一切都很好。。但是,当我将APK交给其他人为我测试时,出现了一个问题。。RTL电话的布局是相反的。。我在
App.js
(根文件)的构造函数中编写了这两行代码来解决这个问题

I18nManager.allowRTL(false);  
I18nManager.forceRTL(false); 
但是,此解决方案仅在应用程序第二次启动时有效,而在应用程序第一次启动时不起作用(这会给人留下很坏的印象)。。我阅读了使用名为RNRestart的npm软件包的解决方案,但它需要链接,expo不支持链接,因此我在第一次启动时使用expo函数
Util.reload()
,但是,这对这些人没有帮助,他们的应用程序布局在第一次使用它时仍然以相反的方式显示

作为一个快速修复,我们决定显示一条错误消息,提示用户退出应用程序,如果这是应用程序第一次加载,则重新输入(这是一个非常糟糕的解决方案)


有人知道为什么会发生这种情况以及如何解决吗?

您可以在AndroidManifest.xml中添加代码,默认情况下禁用Rtl,而无需重新启动应用程序

<!-- AndroidManifest.xml -->
<application
    android:supportsRtl="false"
    ....


而且,您不必同时使用这两种方法。如果你只使用一个,它的工作原理是一样的。您可以在
应用程序
类之外进行设置。下面是一个测试示例

import React,{Component}来自'React';
从“react native”导入{Switch,I18nManager,Text,View,StyleSheet};
从“expo常量”导入常量;
//I18nManager.forceRTL(假);
I18nManager.allowRTL(false);
导出默认类应用程序扩展组件{
状态={
isRTL:I18nManager.isRTL,
};
render(){
返回(
{this.state.isRTL?'Right to Left':'Left to Right'}
福塞尔
);
}
_onDirectionChange=()=>{
I18nManager.forceRTL(!this.state.isRTL);
this.setState({isRTL:!this.state.isRTL});
};
}
const styles=StyleSheet.create({
容器:{
弹性:1,
paddingTop:Constants.statusBarHeight,
背景颜色:“#ecf0f1”,
},
方向框:{
背景色:'#F8',
边框宽度:0.5,
边框颜色:“黑色”,
},
方向文本:{
填充:10,
尺寸:16,
textAlign:'中心',
fontWeight:'粗体',
},
flexDirectionRow:{
flexDirection:'行',
},
switchRowTextView:{
弹性:1,
marginBottom:5,
玛金托普:5,
textAlign:'中心',
},
switchRowSwitchView:{
弹性:3,
},
});

如果检测到I18nManager.isRTL,请重新启动应用程序

怎么做

安装:

npm i fiction-expo-restart
在app.js中 进口:

然后在componentDidMount()函数中:

componentDidMount()
{
  if(I18nManager.isRTL) 
  {
    I18nManager.allowRTL(false);  
    I18nManager.forceRTL(false); 
    Restart();
  }
}
我使用的图书馆可以在这里找到:

我熟悉此解决方案,但是,expo没有编辑清单或编辑本机代码的选项。。所以是的。。但愿我能做到,但我不能在Expo中做到。你在哪里添加的?@hongdevelop在
App.js
的构造函数中,正如我在原始帖子中提到的那样
import {I18nManager} from 'react-native';
componentDidMount()
{
  if(I18nManager.isRTL) 
  {
    I18nManager.allowRTL(false);  
    I18nManager.forceRTL(false); 
    Restart();
  }
}