NativeModule:AsyncStorage为空,带有@ RNC / AsyncStorage

时间:2019-05-07 19:04:04

标签: react-native expo

我正在使用Expo创建一个React Native项目。我一直在使用常规的旧AsyncStorage,从react-native导入,一切都很好。

在查找如何模拟AsyncStorage进行测试时,我发现react-native-community/react-native-async-storage内置了自己的模拟。

因此,我使用yarn add安装了社区插件,并关闭了所有导入语句。

当我运行我的应用程序时,我遇到了一个错误(我正在重新输入自己的名字,请原谅一些省略号):

[@RNC/AsyncStorage]: NativeModule: AsyncStorage is null.

To fix this issue try these steps:

-Run `react-native link @react-native-community/async-storage` in the project root.
-Rebuild and restart the app
-Run the packager with `--clearCache` flag.
-If you are using CocoaPods on iOS...
-If this happens while testing with Jest...

所以我尝试运行react-native link @react-native-community/async-storage,但我不断收到此错误:

Something went wrong while linking. Error: Cannot read property 'pbxprojPath' of null

一些研究表明,Expo应用程序无法(也不需要)链接。

我尝试npm start --clearCache无济于事。

此外,我的项目中没有ios(或android)文件夹。这一直让我感到困惑,因为我看到它遍及整个地方。我通过Expo应用程序在模拟器/仿真器(和设备)中运行我的应用程序。一旦我尝试弹出,便出现了问题。因此,我没有ios文件夹。

(我将回到使用AsyncStorage中的旧版本react-native并自己创建一个模拟文件,但我想知道如何解决此问题以及可能会出现的类似问题未来。)

11 个答案:

答案 0 :(得分:6)

可以通过链接上面提到的模块来纠正此错误,但是如果您的应用是 Expo Managed (通过以下方式创建),则 linking 不起作用expo-cli)。

假设您的应用由世博会管理, 而不是使用Facebook RN文档中的 AsyncStorage

import AsyncStorage from '@react-native-community/async-storage';

要做:

import { AsyncStorage } from 'react-native';

在此处查看文档:{​​{3}}

答案 1 :(得分:2)

让我们试试 @react-native-async-storage/async-storage

如果仍然出错,我认为您将按照 this link

中的步骤进行操作
  • 在 Ios 模拟器中删除应用程序(这是修复错误的主要步骤)
  • 然后cd ios/ && pod install
  • 如果 React Native <= 0.59 运行 react-native link @react-native-async-storage/async-storage
  • 运行npm start --reset-cache
  • 使用 react-native run-ios 重新安装应用

希望能帮到你。

答案 2 :(得分:2)

为我解决这个问题的是首先安装以下库:

expo install @react-native-async-storage/async-storage

然后,更新您的导入:

import AsyncStorage from '@react-native-async-storage/async-storage'
<块引用>

注意:您可能需要在此修复后重新启动 Expo。

答案 3 :(得分:1)

我遇到了同样的问题,原因是因为我正在使用react-native-navigation,它弄乱了MainApplication.java中的android部分,所以我不得不手动更改文件,我已经运行了以下命令: / p>

  

react-native链接@ react-native-community / async-storage

现在我有这个了

   private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(new MainReactPackage(),
            new AsyncStoragePackage()); //<----- here
        }

        @Override
        protected String getJSMainModuleName() {
            return "index";
        }
    };

和这个:

    protected List<ReactPackage> getPackages() {
        // Add additional packages you require here
        // No need to add RnnPackage and MainReactPackage
        return Arrays.<ReactPackage>asList(
                // eg. new VectorIconsPackage()                    
                new AsyncStoragePackage()); //<----- here
    }

答案 4 :(得分:1)

只需关闭Metro捆绑器并运行react-native run-android or run-ios,它将被修复。

答案 5 :(得分:0)

我只是遇到了类似的问题,发现Krizzu在github上提供的答案非常有帮助。他说的是:“如果您使用的是博览会,则无法添加此软件包。使用任何博览会给您的东西(并忽略有关弃用的警告)。和“除非您退出项目,否则无法将其他本机模块添加到expo。”

您可以在以下主题中阅读有关此问题的更多信息: https://github.com/react-native-community/react-native-async-storage/issues/89https://github.com/react-native-community/react-native-async-storage/issues/72。 我希望这会有所帮助。

答案 6 :(得分:0)

运行

react-native link @react-native-async-storage/async-storage

在使用“--reset-cache”详细运行 Metro 并在新的 cmd 中运行“react-native run-android”之后解决了我的问题

答案 7 :(得分:0)

再次运行项目试试

  • npx react-native run-android 命令。

如果您使用的是 iOS 设备,则:

  • cd ios && pod install

  • npx react-native run-ios

如果还是不行,请尝试重新安装 npm 包并按照官方文档进行操作。

答案 8 :(得分:0)

如果您使用的是 react-native >=0.60,请尝试:

在第一个终端窗口中,启动服务器:

$ react-native start --reset-cache

在第二个终端窗口中,构建应用程序:

$ react-native run-android

答案 9 :(得分:0)

在 package.json 中创建的链接:

    "@react-native-community/async-storage": "https://github.com/react-native-async-storage/async-storage",

答案 10 :(得分:-1)

在 node_modules/@react-native-async-storage/async-storage”/async-storage/src/AsyncStorage.native.js 中, 将 RCTAsyncStorage from './RCTAsyncStorage' 替换为 import RCTAsyncStorage from './RCTAsyncStorage.expo';