Привет, друзья,
В этой статье мы будем создавать ярлыки приложений для приложений React Native, как показано на изображении. Мы будем создавать их с помощью библиотеки react-native-app-shortcuts.
Прежде всего!!!
node --version
v16.14.1
npm --version
8.5.0
java --version
openjdk 11.0.11 2021-04-20
- Создайте новое приложение React Native, используя следующие команды —
- Установим зависимости
- Начнем путешествие по коду ->
- Шаги для создания экранов Home.js, Chat.js и Notification.js
- Home.js
- Chat.js
- Notification.js
- Давайте создадим ярлыки приложений для нашего приложения ->
- Важные вещи, которые следует отметить —
Создайте новое приложение React Native, используя следующие команды —
npx react-native init [YOUR_PROJECT_NAME] --version 0.68.2
Примечание — Я использую 0.68 версию React Native. Если вы обновили React Native до последней версии, вы можете создать приложение с помощью команды ->
npx react-native init [YOUR_PROJECT_NAME]
Установим зависимости
Мы будем устанавливать навигационные зависимости для поддержки навигации между несколькими экранами в нашем приложении.
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context
После установки навигационных зависимостей мы установим библиотеку react-native-app-shortcuts в наше приложение.
npm i react-native-app-shortcuts
Итоговый файл package.json
должен быть похож на этот ->
package.json
{
"name": "RNAppShortcuts",
"version": "0.0.1",
"private": true,
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"start": "react-native start",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"@react-navigation/native": "^6.0.11",
"@react-navigation/native-stack": "^6.7.0",
"react": "17.0.2",
"react-native": "0.68.2",
"react-native-app-shortcuts": "^0.2.0",
"react-native-safe-area-context": "^4.3.1",
"react-native-screens": "^3.15.0"
},
"devDependencies": {
"@babel/core": "^7.18.10",
"@babel/runtime": "^7.18.9",
"@react-native-community/eslint-config": "^3.1.0",
"babel-jest": "^28.1.3",
"eslint": "^8.21.0",
"jest": "^28.1.3",
"metro-react-native-babel-preset": "^0.72.0",
"react-test-renderer": "17.0.2"
},
"jest": {
"preset": "react-native"
}
}
Начнем путешествие по коду ->
- Удалите код шаблона в
App.js
и убедитесь, чтоApp.js
выглядит следующим образом ->-.
App.js
import React from 'react';
import {
StyleSheet,
Text,
View,
} from 'react-native';
const App = () => {
return (
<View>
</View>
);
};
const styles = StyleSheet.create({
});
export default App;
-
Удалите константу
styles
и импорт из ‘react-native’. -
Мы создадим навигационный контейнер и стековый навигатор, которые будут содержать различные экраны для нашего приложения.
-
Импортируйте NavigationContainer и createNativeStackNavigator() из ‘react-navigation/native’ и ‘react-navigation/native-stack’ соответственно.
import {NavigationContainer} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
- Измените оператор возврата в файле
App.js
. ВернитеNavigationContainer
, который заключает в себе нашStack.Navigator
, внутри которого определены все наши экраны вместе с их именами и компонентами.
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeComponent} />
<Stack.Screen name="Notification" component={NotificationComponent} />
<Stack.Screen name="Chat" component={ChatComponent} />
</Stack.Navigator>
</NavigationContainer>
);
- Далее мы определим эти компоненты, а именно —
HomeComponent
,NotificationComponent
иChatComponent
.
В том же файле App.js
создайте три константы типа ->
const NotificationComponent = ({navigation}) => {
return (
<>
<Notification navigation={navigation} />
</>
);
};
const ChatComponent = ({navigation}) => {
return (
<>
<Chat navigation={navigation} />
</>
);
};
const HomeComponent = ({navigation}) => {
return (
<>
<Home navigation={navigation} />
</>
);
};
- Импортируйте экраны Chat, Home, Notification в виде ->
import Notification from './src/Notification';
import Chat from './src/Chat';
import Home from './src/Home';
На этом этапе ваш App.js
будет выглядеть следующим образом ->
App.js
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import Notification from './src/Notification';
import Chat from './src/Chat';
import Home from './src/Home';
const Stack = createNativeStackNavigator();
const NotificationComponent = ({navigation}) => {
return (
<>
<Notification navigation={navigation} />
</>
);
};
const ChatComponent = ({navigation}) => {
return (
<>
<Chat navigation={navigation} />
</>
);
};
const HomeComponent = ({navigation}) => {
return (
<>
<Home navigation={navigation} />
</>
);
};
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeComponent} />
<Stack.Screen name="Notification" component={NotificationComponent} />
<Stack.Screen name="Chat" component={ChatComponent} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
-
На этом этапе он может выдать ошибку, что экранов Home, Notification и Chat не существует, и поэтому они не могут быть импортированы.
-
Давайте исправим это.
-
Создайте папку src на уровне
-
Создайте 3 файла в папке src, а именно -> Home.js, Notification.js и Chat.js.
-
Также для иконок скачайте иконки Notification icon и Chat icon с соответствующих ссылок в формате .png и добавьте в структуру проекта приложения по адресу
android/app/src/main/res/drawable
- Ваша структура папок для добавления png файлов иконок будет ->
- Ваша структура папок в конечном итоге должна выглядеть следующим образом ->
Шаги для создания экранов Home.js, Chat.js и Notification.js
Home.js
Создайте функциональный компонент с именем Home.js и экспортируйте его по умолчанию из этого файла.
Убедитесь, что каждый из экранов Home.js, Chat.js и Notification.js принимает объектnotification
в качествеprops
.
const Home = ({navigation}) => {
return (
);
};
export default Home;
Создайте константу styles и создайте homeStyle.
const styles = StyleSheet.create({
homeStyle: {
display: 'flex',
flex: 1,
justifyContent: 'center',
alignSelf: 'center',
},
});
homeStyle будет назначен единственному виду на главном экране со значением flex равным 1, чтобы он занимал все пространство.
Внутри метода return функционального компонента Home верните View со стилями как homeStyle, который содержит текстовый компонент как «Home Screen».
return (
<View style={styles.homeStyle}>
<Text>{'Home Screen'}</Text>
</View>
);
Home.js
на этом этапе будет выглядеть как ->
Home.js
import React from 'react';
import {Text, StyleSheet, View} from 'react-native';
const Home = ({navigation}) => {
return (
<View style={styles.homeStyle}>
<Text>{'Home Screen'}</Text>
</View>
);
};
const styles = StyleSheet.create({
homeStyle: {
display: 'flex',
flex: 1,
justifyContent: 'center',
alignSelf: 'center',
},
});
export default Home;
Chat.js
Аналогично создайте экран Chat.js со следующим кодом ->
Chat.js
import React from 'react';
import {StyleSheet, Text, TouchableOpacity} from 'react-native';
const Chat = ({navigation}) => {
return (
<TouchableOpacity
onPress={() => {
navigation.navigate('Notification');
}}
style={styles.cta1Style}>
<Text style={styles.ctaTitleStyle}>{'Switch to Notifications'}</Text>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
cta1Style: {
backgroundColor: 'red',
padding: 20,
},
ctaTitleStyle: {
color: 'white',
},
});
export default Chat;
Notification.js
Аналогично создайте экран Notification.js со следующим кодом ->
import React from 'react';
import {StyleSheet, Text, TouchableOpacity} from 'react-native';
const Notification = ({navigation}) => {
return (
<TouchableOpacity
onPress={() => {
navigation.navigate('Chat');
}}
style={styles.cta2Style}>
<Text style={styles.ctaTitleStyle}>{'Switch to Chat'}</Text>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
cta2Style: {
backgroundColor: 'blue',
padding: 20,
},
ctaTitleStyle: {
color: 'white',
},
});
export default Notification;
Вот и все… Теперь вы можете не видеть никаких ошибок, если все работает идеально…
Давайте создадим ярлыки приложений для нашего приложения ->
-
Импортируйте
RNAppShortcuts
из ‘react-native-app-shortcuts’ в файлApp.js
. -
Внутри функционального компонента App перед оператором return создайте 2 действия с помощью RNAppShortcuts.addShortcut({})
App.js
import React from 'react';
import {NavigationContainer} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import Notification from './src/Notification';
import Chat from './src/Chat';
import Home from './src/Home';
import RNAppShortcuts from 'react-native-app-shortcuts';
const Stack = createNativeStackNavigator();
const NotificationComponent = ({navigation}) => {
return (
<>
<Notification navigation={navigation} />
</>
);
};
const ChatComponent = ({navigation}) => {
return (
<>
<Chat navigation={navigation} />
</>
);
};
const HomeComponent = ({navigation}) => {
return (
<>
<Home navigation={navigation} />
</>
);
};
const App = () => {
RNAppShortcuts.addShortcut({
id: '1',
shortLabel: 'Notify',
longLabel: 'Open Notifications',
iconFolderName: 'drawable',
iconName: 'notification',
});
RNAppShortcuts.addShortcut({
id: '2',
shortLabel: 'Chat',
longLabel: 'Open Chats',
iconFolderName: 'drawable',
iconName: 'chat',
});
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeComponent} />
<Stack.Screen name="Notification" component={NotificationComponent} />
<Stack.Screen name="Chat" component={ChatComponent} />
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
-
Теперь мы создадим обработчики, которые будут активироваться при нажатии на один из ярлыков приложения.
-
В файле
Home.js
импортируйте useEffect из React и создайте эквивалент useEffect() для ComponentWillMount() класса component для функционального компонента Home. -
Также импортируйте RNAppShortcuts из ‘react-native-app-shortcuts’ для определения обработчика ярлыков приложения.
-
Этот useEffect будет срабатывать каждый раз, когда этот экран загружается или монтируется. Здесь мы определим наш обработчик App Shortcuts.
-
Обработчик ярлыков приложений создается с помощью
RNAppShortcuts.handleShortcut(id => {});
. -
На данном этапе
Home.js
должен выглядеть как ->
Home.js
import React, {useEffect} from 'react';
import {Text, StyleSheet, View} from 'react-native';
import RNAppShortcuts from 'react-native-app-shortcuts';
const Home = ({navigation}) => {
useEffect(() => {
RNAppShortcuts.handleShortcut(id => {
console.log(id);
if (id === '1') {
navigation.navigate('Notification');
} else if (id === '2') {
navigation.navigate('Chat');
}
});
}, []);
return (
<View style={styles.homeStyle}>
<Text>{'Home Screen'}</Text>
</View>
);
};
const styles = StyleSheet.create({
homeStyle: {
display: 'flex',
flex: 1,
justifyContent: 'center',
alignSelf: 'center',
},
});
export default Home;
Важные вещи, которые следует отметить —
- В React Native есть несколько библиотек для создания ярлыков приложений.
-
react-native-app-shortcuts
-
react-native-quick-actions
-
react-native-actions-shortcuts .
- Ярлыки добавляются с помощью следующего кода, который принимает такие параметры, как id, shortLabel , longLabel, iconFolderName, где находится изображение ярлыка, iconName, который имеет некоторые правила именования.
RNAppShortcuts.addShortcut({
id,
shortLabel,
longLabel,
iconFolderName,
iconName,
});
-
Изображения иконок должны быть добавлены в папки android и iOS в нужных местах.
-
Мы можем добавить все ярлыки приложения на всплеск экрана или добавить ярлыки приложений в зависимости от того, какую часть приложения изучил пользователь.
-
Мы можем удалить ярлыки приложений с помощью
-
Мы можем удалить все ярлыки приложений с помощью
-
Статические ярлыки приложений — это ярлыки, которые создаются во время установки приложения.
-
Библиотека react-native-quick-actions поддерживает статические ярлыки приложений для устройств IOS.
-
Обработчик ярлыков приложений может быть создан с помощью функции
-
Обработчик принимает id, используя который мы можем выполнять различные операции при нажатии на разные ярлыки приложений.
Воооооооооооо!!! Мы завершили проект. Ура!!!
Следите за мной в Twitter, чтобы узнать больше о ReactNative и Flutter.