我是反应原生的新手。我正在使用 React Native Paper 为所有屏幕提供主题。我还使用反应导航堆栈导航器和抽屉导航器。首先,对于导航,纸张主题在导航组件中不起作用。但如果我不使用反应导航那么它就可以工作。
所以我尝试通过“withTheme”将主题从一个组件传递到另一个组件。但 withTheme 没有给我自定义主题道具。
这是我的 App.js
import { DefaultTheme,Provider as PaperProvider, Drawer, Avatar, withTheme } from 'react-native-paper';
import { createAppContainer,createSwitchNavigator } from 'react-navigation';
import { createDrawerNavigator } from 'react-navigation-drawer'
const theme = {
...DefaultTheme,
roundness: 8,
colors: {
...DefaultTheme.colors,
primary: '#ff0000',
accent: '#000000',
text: "#cc1111",
background: "#000000",
contained: '#000000'
},
dark: true
};
class App extends Component {
render(){
return(
<PaperProvider theme={theme}>
<switchNavigator />
</PaperProvider>
)
}
};
const switchNavigator = createSwitchNavigator({
Login: Login,
dranav: drawyerNavigator …Run Code Online (Sandbox Code Playgroud) 我正在使用NavigationEvents自动加载我的列表。
到目前为止,它确实有效,并且加载了我更新的列表,但在控制台上,它继续在无限循环上运行 API 调用函数。
但是,每当我打开列表屏幕时,我只想加载 API 调用函数一次。
因此,如果有更好的解决方案,请随时提供帮助。
代码片段如下:
import { NavigationEvents } from 'react-navigation';
import NameActionBar from '../components/mNameActionBar';
import FreelancerList from '../components/mFreelancerList';
export default class MasterScreen extends Component {
componentDidMount() {
this.getFreelancerList();
console.log('ComponentDidMount()');
}
getFreelancerList() {
console.log('Freelancer List');
let self = this;
AsyncStorage.getItem('my_token').then((keyValue) => {
console.log('Master Screen (keyValue): ', keyValue); //Display key value
axios({
method: 'get',
url: Constants.API_URL + 'user_m/freelancer_list/',
responseType: 'json',
headers: {
'X-API-KEY': Constants.API_KEY,
'Authorization': keyValue,
},
})
.then(function (response) {
//console.log('Response Data: ', response.data.data); …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,如果用户未登录,我将显示登录屏幕;如果用户已登录,我将显示登录屏幕。在下面的简单示例中,您可以看到我正在检查 和 是否存在于jwt我user的应用程序中redux 存储,然后显示相应的屏幕。
type Props = {
+jwt: string | null;
+user: UserModel | null;
};
export class AuthStackNavigator extends Component<Props> {
renderScreen() {
if (this.props.jwt && this.props.user) {
return (
<Stack.Screen name={'AuthenticatedView'} component={AuthenticatedView} />
);
} else {
return (
<Stack.Screen name={'LoginView'} component={LoginView} />
);
}
}
render() {
return (
<Stack.Navigator>
{this.renderScreen()}
</Stack.Navigator>
);
}
}
const mapStateToProps = (state) => {
return {
jwt: getJwt(state),
user: getUser(state)
};
};
export default connect(mapStateToProps)(AuthStackNavigator); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在选项卡导航器之间传递一些参数。下面是我的程序的结构。粗体字为路线
应用程序(选项卡导航器):{主(堆栈)和过滤器(屏幕)}
主要(堆栈导航器):{ Home(屏幕)和MediaDetails(屏幕)}
我在屏幕上有一个与Filter关联的按钮,它具有onPress()函数。我传递了一些参数(但为了解决这个问题,我们只考虑参数) 。
this.props.navigation.navigate('Home', {
to: this.state.to,
}
Run Code Online (Sandbox Code Playgroud)
现在在与Home关联的屏幕中,我正在读取状态内的参数,如下所示:
state = {
to: this.props.route.params.to
}
Run Code Online (Sandbox Code Playgroud)
在App.js内部,我将to的初始值设置为“2020”,如下所示:
<Stack.Screen
name="Home"
component={HomeScreen}
initialParams={{
to: '2020'
}}
/>
Run Code Online (Sandbox Code Playgroud)
初始值确实设置为2020。我按下按钮。假设我设置为1900 。就在this.props.navigation.navigate执行之前,我console.log(this.state.to)该值,它确实更新为1900。但是,当屏幕更改为Home时,该值将恢复为2020(通过 console.log 观察到)
有人能指出这种怪异行为的原因吗?我已经尝试调试这个好几个小时了,但没有成功。React Navigation 5 也很新,所以在网上找不到类似的东西。任何帮助将不胜感激。感谢您一路以来的阅读。
编辑:问题已解决,完整代码已删除!
react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v5
我被困住了,因为我想切换到 React-navigation 的 V5 版本。\n在 v4 中,我曾经传递我的参数并将它们与以下命令一起使用:
\n\nthis.props.navigation.navigate(\'MyDestination\', {myParam: \'value\'})
this.props.navigation.getParam(\'myParam\')
在 v5 中,有些事情发生了变化,我现在无法使用它,this.props.navigation因为应用程序似乎不知道它。
我的代码被拆分,因此我的 App.js 仅引用导航类:
\n\nimport React from \'react\';\nimport { StyleSheet, Text, View } from \'react-native\'\nimport Navigation from \'./navigation/Navigation\'\n\nexport default function App() {\n return (\n <Navigation/>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: \'#fff\',\n alignItems: \'center\',\n justifyContent: \'center\',\n },\n});\nRun Code Online (Sandbox Code Playgroud)\n\n然后我的导航文件包含所有导航机制(我还没有添加我的 TabBar,因为我想首先修复基本导航):
\n\nimport { NavigationContainer } from \'@react-navigation/native\'\nimport …Run Code Online (Sandbox Code Playgroud) 我不知道是什么导致了我的 React Native 应用程序中的这个错误。我正在使用 React Navigation 库的版本 5。
有时它会随机使应用程序崩溃。谷歌搜索并没有帮助我理解这是什么。这是非常有选择性的,但这是一件好事(或坏事)。
那么这意味着什么以及可能导致它的原因是什么?
react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v5
我有一个堆栈导航器,其中一个屏幕使用自定义标题:
import { createStackNavigator } from "@react-navigation/stack";
import * as React from "react";
import { Button, View } from "react-native";
const Stack = createStackNavigator();
function ScreenA({ navigation }) {
return (
<View style={{ flex: 1, justifyContent: "center"}}>
<Button title="Click me" onPress={() => navigation.navigate("ScreenB")} />
</View>
);
}
function ScreenB({ navigation }) {
return (
<View style={{ flex: 1 , justifyContent: "center"}}>
<Button title="Click me" onPress={() => navigation.navigate("ScreenA")} />
</View>
);
}
function TestComp() {
return (
<Stack.Navigator>
<Stack.Screen
name="ScreenA"
component={ScreenA} …Run Code Online (Sandbox Code Playgroud) 我的 React Native 0.61.5 使用react-navigation 5.1. 这是根导航代码:
const BTab = createBottomTabNavigator();
const Stack = createStackNavigator();
export default function App() {
//const Appscreen = () => (<AppScreen data={data}/>);
return (
<NavigationContainer>
<Stack.Navigator InitialRouteName="Splash">
<Stack.Screen name="Splash" component={SplashScreen}}/>
<Stack.Screen name="App" component={AppScreen} } />
</Stack.Navigator>
</NavigationContainer>
);
}
Run Code Online (Sandbox Code Playgroud)
该组件AppScreen返回一个如下所示的堆栈:
return (
<NavigationContainer independent={true}>
<BTab.Navigator>
<BTab.Screen name="Event" component={Eventstack} />
<BTab.Screen name="Group" component={Groupstack} />
<BTab.Screen name="Contact" component={Contactstack} />
</BTab.Navigator>
</NavigationContainer>
);
Run Code Online (Sandbox Code Playgroud)
我注意到屏幕上有双标题:
如何删除App标题并只保留Group?
我现在使用 React Native 导航 5,在我的“Home 组件中,我有一个 setParams 可以工作,但我收到了这个错误:
\n\n\n\n
{"params":{"company":"Marciello Resto 2"}}“任何导航器都没有处理带有有效负载的‘SET_PARAMS’操作。”
我用的是安卓模拟器。
\n感谢大家的帮助!
\n//App.js\nimport * as React from "react"\nimport { View, Text, ActivityIndicator, StyleSheet } from 'react-native'\nimport { NavigationContainer } from '@react-navigation/native'\nimport { createStackNavigator } from '@react-navigation/stack'\nimport { createDrawerNavigator } from '@react-navigation/drawer'\nimport EtiquettesPictureContext from './Components/Contexts/EtiquettesPictureContext'\nimport RootStack from './Navigation/Navigation'\nimport Home from './Components/Layouts/Home'\nimport Etiquettes from './Components/Layouts/Etiquettes'\nimport TemperaturesFridges from './Components/Layouts/TemperaturesFridges'\nimport BonsLivraisons from './Components/Layouts/BonsLivraisons'\nimport EtiquettesTakePicture from "./Components/EtiquettesTakePicture"\nimport BonsLivraisonsTakePicture from "./Components/BonsLivraisonsTakePicture"\nimport DlcAlertTakePicture from "./Components/DlcAlertTakePicture"\nimport Notifications from "./Components/Layouts/Notifications"\nimport Settings …Run Code Online (Sandbox Code Playgroud) 这是我的 appNavigator:我分为 3 个 stackScreen,包括HomeStack、 SettingsStack和ProfileStack。AuthStack包含注册和登录屏幕,我创建底部选项卡包含上面的 3 个 StackScreen
const HomeStack = createStackNavigator();
function HomeStackScreen() {
return (
<HomeStack.Navigator headerMode="none">
<HomeStack.Screen name="Home" component={HomeScreen} />
<HomeStack.Screen name="Details" component={DetailsScreen} />
</HomeStack.Navigator>
);
}
const SettingsStack = createStackNavigator();
function SettingsStackScreen() {
return (
<SettingsStack.Navigator>
<SettingsStack.Screen name="Settings" component={SettingsScreen} />
<SettingsStack.Screen name="Details" component={DetailsScreen} />
</SettingsStack.Navigator>
);
}
const ProfileStack = createStackNavigator();
function ProfileStackScreen({navigation}) {
return (
<ProfileStack.Navigator>
<ProfileStack.Screen name="Profile" component={ProfileScreen} />
</ProfileStack.Navigator>
);
}
// ** AUTH ** …Run Code Online (Sandbox Code Playgroud) react-navigation ×10
react-native ×6
javascript ×2
react-navigation-bottom-tab ×2
class ×1
header ×1
navigation ×1
reactjs ×1
router ×1
routes ×1