#javascript #reactjs #react-native
#javascript #reactjs #реагирующий — собственный
Вопрос:
Я создаю приложение для Android на react native и получаю эту ошибку при использовании useState
в файле утилиты: Ошибка
WARN Possible Unhandled Promise Rejection (id: 287):
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
Попытка исправить ошибку npm ls react
, которую я запустил, в результате чего я получил это:
mobile_app@1.0.0 C:...mobile_app
-- @react-native-community/masked-view@0.1.10
| `-- react@17.0.1 deduped invalid
-- @react-navigation/native@5.9.3
| -- @react-navigation/core@5.15.2
| | `-- react@17.0.1 deduped
| `-- react@17.0.1 deduped
-- @react-navigation/stack@5.14.3
| `-- react@17.0.1 deduped
-- expo@40.0.1
| -- expo-asset@8.2.1
| | `-- react@17.0.1 deduped
| -- expo-error-recovery@1.4.0
| | `-- react@17.0.1 deduped
| -- expo-file-system@9.3.0
| | `-- react@17.0.1 deduped
| -- expo-font@8.4.0
| | `-- react@17.0.1 deduped
| -- expo-keep-awake@8.4.0
| | `-- react@17.0.1 deduped
| -- expo-linear-gradient@8.4.0
| | `-- react@17.0.1 deduped
| -- expo-permissions@10.0.0
| | `-- react@17.0.1 deduped
| `-- expo-sqlite@8.5.0
| `-- react@17.0.1 deduped
-- react-dom@17.0.1
| `-- react@17.0.1 deduped
-- react-native-eva-icons@1.3.1
| `-- react@17.0.1 deduped invalid
-- react-native-reanimated@1.13.2
| `-- react@17.0.1 deduped
-- react-native-safe-area-context@3.1.9
| `-- react@17.0.1 deduped
-- react-native-screens@2.18.0
| `-- react@17.0.1 deduped
-- react-native-svg@12.1.0 invalid
| `-- react@17.0.1 deduped
-- react-native-web@0.15.0
| `-- react@17.0.1 deduped
-- react-native@0.63.4
| -- react@17.0.1 deduped invalid
| `-- use-subscription@1.5.1
| `-- react@17.0.1 deduped
-- react-test-renderer@16.13.1
| `-- react@17.0.1 deduped invalid
`-- react@17.0.1 invalid
npm ERR! code ELSPROBLEMS
npm ERR! invalid: react@17.0.1 C:...mobile_appnode_modulesreact
npm ERR! A complete log of this run can be found in:
npm ERR! C:...AppDataLocalnpm-cache_logs2021-03-02T12_38_31_428Z-debug.log
Это всего лишь предупреждение, но при получении 1000 в минуту я заинтересован в том, чтобы это не происходило и исправляло недопустимые версии react.
Редактировать:
Ниже приведен код, который я использую для вызова перехвата. util/wifiScanner.js
import React, {useState} from 'react';
import PermissionsAndroid from "react-native";
import WifiManager from "react-native-wifi-reborn";
const requestFineLocationPermission = async () => {
....
};
export async function getBeacons(props){
await requestFineLocationPermission();
const [wifiList, setWifiList] = useState(/* initialValue */); // you may provide an initial value (optional, defaults to undefined)
WifiManager.setEnabled(true);
WifiManager.reScanAndLoadWifiList().then((data) => {
// update the state here
setWifiList(data);
});
return wifiList;
};
Здесь на главном экране вызывается функция getBeacons:
screens/mainscreen.js
import React, {useState} from 'react';
import { StyleSheet, PermissionsAndroid, Linking, View, TouchableOpacity } from 'react-native';
import { IndexPath, Layout, Text, Button, Select, SelectItem } from '@ui-kitten/components';
import { Icon } from 'react-native-eva-icons';
import {styles} from '../styles'
import WifiManager from "react-native-wifi-reborn";
import {getBeacons} from '../../util/wifiScanner';
const MainScreen = async ({navigation}) => {
let list = await getBeacons(); // Currently throws {_U, _V, _W, _X} error
return (
<Layout style={styles.container}>
...
</Layout>
);
}
export default MainScreen;
Комментарии:
1. Возможно , это несоответствие / несколько версий React (я видел, как это происходило один раз ), но более вероятно, что у вас действительно есть недопустимый вызов перехвата. Опубликуйте свой код.
2. Те недопустимые совпадения, которые у вас есть, вызваны тем, что эти пакеты все еще полагаются на
react@16.x.x
.react-native@0.63.4
кажется, «привязывается»react
к16.13.1
.3. @JaredSmith Я добавил код, который вызывает перехват
4. @UnknownPerson что вам нужно сделать, и я не имею в виду никаких обид, мы все с чего-то начинаем, это проработать несколько руководств по реагированию. Похоже, вы действительно не понимаете, как это работает. У вас не может быть компонента асинхронной функции. Вы не можете вызывать побочные функции вне
useEffect
перехвата. Вы не можете вызывать перехваты в случайных функциях Javascript. Данные практически обо всем этом есть в официальном руководстве . Если это для code bootcamp или класса, вы можете захотеть пообщаться со своим инструктором, похоже, они, возможно, бросили вас на съедение волкам…5. … без достаточного руководства или инструкции. Этот ответ, который я ссылался в моем предыдущем комментарии, в значительной степени дает вам представление о том, как извлекать и отображать асинхронные данные, см. Второй раздел, где он использует перехваты.