react-native Navigation导航器,retrofit源码

React Native 0.60及更高版本,链接是自动的。因此,不需要运行 react-native link

如果在Mac上并为iOS开发,您需要安装Pad(通过Cocoapods)以完成链接

npx pod-install ios

在 App.js 或者 index.js 拷贝进以下代码

import ‘react-native-gesture-handler’;

2. 创建一个堆栈导航器(Stack Navigation)

2.1 安装堆栈导航依赖

npm install @react-navigation/stack

2.2 navigation 可用 API

在所有的页面组件中都可以获取到navigation属性(只要组件被定义为路由配置和使用React Navigation来渲染路由)。

// const {route, navigation} = this.props; // class写法
// 可用api
navigation.navigate(“RouteName”) // 如果新路由不在堆栈中,则将其推到堆栈导航器,否则将跳转到这个页面。
navigation.push(“RouteName”) // 跳转去相关路由页面 可以多次跳转到相同路由页面
navigation.goBack() // 返回上一个页面
navigation.popToTop() // 回到堆栈的第一个屏幕页面
navigation.popToTop() // 回到堆栈的第一个屏幕页面
navigation.popToTop() // 回到堆栈的第一个屏幕页面

2.3 Example

// In App.js in a new project

import * as React from ‘react’;
import { View, Text, Button } from ‘react-native’;
import { NavigationContainer } from ‘@react-navigation/native’;
import { createStackNavigator } from ‘@react-navigation/stack’;

function LoginScreen({navigation}) {
return (
<View style={{ flex: 1, alignItems: ‘center’, justifyContent: ‘center’ }}>
Login Screen
<Button title=“User Login” onPress={() => navigation.navigate(“Home”)}>

);
}
function HomeScreen({navigation}) {
return (
<View style={{ flex: 1, alignItems: ‘center’, justifyContent: ‘center’ }}>
Home Screen
<Button title=“Home Page” onPress={() => navigation.navigate(“Login”)}>

);
}

const Stack = createStackNavigator();
// 想隐藏第一个标题的头部导航
// <Stack.Screen name=“Login” options={{headerShown: false}} component={LoginScreen} />

function App() {
return (

<Stack.Navigator>
// options={({ route }) => ({ title: route.params.name })} // 头部导航可以根据路由参数动态修改
<Stack.Screen name=“Login” component={LoginScreen} />
<Stack.Screen name=“Home” component={HomeScreen} />
</Stack.Navigator>

);
}

export default App;

2.4 设置stack堆栈导航动画

内置了相应的跳转动画

  1. forHorizontal:从右向左进入
  2. forVertical:从下向上进入
  3. forFadeFromBottomAndroid:从底部淡出
  4. forFade:无动画

function App() {
return (

<Stack.Navigator>
<Stack.Screen name=“Login” component={LoginScreen} />
// Home页面 添加从右向左进入动画
<Stack.Screen name=“Home” component={HomeScreen} options={{headerShown: false, cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS}} />
</Stack.Navigator>

);
}


每次调用推送时,我们都会向导航堆栈添加新路由。当您调用导航时,它首先尝试查找具有该名称的现有路由,并且只有在堆栈上还没有新路由时,才会推送新路由。

这样就完成了一个堆栈导航了,可以完成登录注册这种类似页面的切换了。

2.5 导航器(路由)传参
2.5.1 嵌套在导航内的参数

将路由上需要的参数放在一个对象里,作为 navigation.navigate 函数的第二个参数:navigation.navigate('RouteName', {key: value}) ,在组件中获取这个参数:route.params。

navigation.navigate(‘Home’, {
screen: ‘Settings’,
params: { user: ‘Tom’ },
});

2.5.2 更新参数

页面上也可以更新参数,类似更新页面状态。navigation.setParams就可以用来更新页面参数

你也可以向页面传递一些初始参数。如果导航到页面并没有设置任何参数,这个初始参数将会被使用。它们会与传递的参数进行浅合并。初始参数被指定为initialParams 属性:

<Stack.Screen
name=“Login”
component={Login}
initialParams={{ userId: 42 }}
/>

2.5.3 传递参数到之前的页面

不仅仅能传递参数到新的页面,也能传递参数到之前的页面。

想做到这个,你可以使用navigate的方法,如果页面存在的话,可以使用像 goBack 这样的方法。你可以通过navigate携带参数将参数传回去:

// Some.js
import React, { useState, Component } from “react”;
import { Text, View } from “react-native”;

class App extends Component {
constructor(props) {
super(props)
}
render() {
return (

{this.props.route.params.type ? this.props.route.params.type : “has null”}

)
}
}
export default App;

// Home.js
import * as React from ‘react’;
import { View, TextInput, Button } from ‘react-native’;
function goLogin(navigation, postText) {
navigation.push(“Login”, {type: postText}) // 把输入框的值传递给 Login 页面
}
function Some({navigation, route}) {
let {text} = route.params;
let [postText, setPostText] = React.useState(text);
return (

<TextInput
multiline
placeholder=“What’s on your mind?”
style={{ height: 200, padding: 10, backgroundColor: ‘gray’ }}
value={postText}
onChangeText={setPostText}
/>
<Button
title=“Go to Login”
onPress={() => goLogin(navigation, postText)}
/>

);
}
export default Some;

2.6 配置header bar

自定义 header 样式有3个关键属性:headerStyle, headerTintColor ,和 headerTitleStyle

function App() {
return (

<Stack.Navigator>
<Stack.Screen
name=“Home”
component={Home}
options={{
title: ‘My home’,
headerStyle: {
backgroundColor: ‘#f4511e’,
},
headerTintColor: ‘#fff’,
headerTitleStyle: {
fontWeight: ‘bold’,
},
}}
/>
</Stack.Navigator>

);
}

2.7 Header Button

给 header 右侧添加一个操作按钮–常见功能

function App() {
return (

<Stack.Navigator initialRouteName=“Login”>
<Stack.Screen options={{headerShown: false}} name=“Login” component={Login} />
<Stack.Screen name=“Some” component={Some}
options={{
headerRight: () => (
<Button
onPress={() => alert(‘This is a button!’)}
title=“add”
color=“#999”
/>
),
}}
/>
</Stack.Navigator>

);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

推荐学习资料


  • 脑图
    360°全方位性能调优


    由于文章篇幅问题点击链接查看详细文章以及获取学习笔记:GitHub

WOREEELU-1710671420417)]

推荐学习资料


  • 脑图
    [外链图片转存中…(img-KOI6yk4d-1710671420418)]
    [外链图片转存中…(img-cD9UUUkJ-1710671420418)]
    [外链图片转存中…(img-MW6JyDFc-1710671420418)]
    由于文章篇幅问题点击链接查看详细文章以及获取学习笔记:GitHub
  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值