【问题标题】:How to restart app (react native and expo)如何重启应用(react native 和 expo)
【发布时间】:2020-11-12 16:53:13
【问题描述】:

我使用 expo,所以我无法访问 android 文件夹。

我想第一次重新启动我的应用程序。我该怎么做?

我使用react-native-restart,但没有工作,我现在有一个错误:

null 不是对象(评估 'x.default.restart;)

代码:

  componentDidMount() {
    if (I18nManager.isRTL) {
      I18nManager.forceRTL(false);
      RNRestart.Restart();
    }
  }

如何重新启动我的应用程序?

【问题讨论】:

  • 你可以使用react-native-code-push
  • @hongdevelop 你能发一个答案吗?我在文档中找不到任何相关命令...
  • 这个问题解决了这个问题:github.com/expo/expo/issues/10598。 TL:DR - import { reloadAsync } from "expo-updates"; setTimeout(async () => await reloadAsync(), 100);
  • I18nManager.allowRTL(false); I18nManager.forceRTL(false);

标签: react-native expo


【解决方案1】:

我遇到同样的问题一个多月了,没有任何帮助,所以我开发了一个库来完成这个,使用简单的安装它:

npm i fiction-expo-restart

并像这样导入它:

import {Restart} from 'fiction-expo-restart';

然后当你想重新启动时,使用:

Restart();

请注意,如果此答案过时,您可以在此处查看库:https://www.npmjs.com/package/fiction-expo-restart

【讨论】:

  • @oroncohen 怎么样?你能解释一下吗?这个库仍然有效,如果你能做一个世博小吃,我可以解决你的问题
  • 这个库没有公开的源代码。我不安装任何我无法阅读其代码的东西......虽然,@oroncohen 向博览会提出了一个功能请求:expo.canny.io/feature-requests/p/… - 如果需要,请投票
  • 我今天将其公开发布。我什至没有注意到这一点。
  • 它只是调用 Updates.reloadAsync。这不适用于我的 expo 应用程序。
  • @AliMertCakar 很好,它适用于其他人。如果您仍然没有找到任何解决方案,请让我帮助您,请通过 mahevstark@gmail.com 联系我
【解决方案2】:

我遇到了同样的问题,并在某处找到了这个解决方案。

您可以尝试像这样使用expo 中的Updates

import { Updates } from 'expo';

Updates.reload();

【讨论】:

  • 我认为我不能使用“更新”,因为我禁用了它并且我不想检查更新。对吗?
  • 这个答案不再适用于 SDK v37 - blog.expo.io/expo-sdk-37-is-now-available-dd5770f066a6#858aUpdates.reload() 不再存在,如果没有更新,Updates.reloadAsync() 似乎也不会被触发。
  • 好的,所以问题不在于新更新的可用性,而是Updates.reloadAsync() 在我的案例中被触发太接近应用程序初始化。临时解决方法是将其包装在某个超时时间,要跟进的问题在这里 - github.com/expo/expo/issues/10598
【解决方案3】:
import { StatusBar } from "expo-status-bar";
import React from "react";
import { Button, I18nManager, StyleSheet, Text, View } from "react-native";
import * as Updates from "expo-updates";

async function toggleRTL() {
  await I18nManager.forceRTL(I18nManager.isRTL ? false : true);
  await Updates.reloadAsync();
}

export default function App() {
  return (
    <View style={styles.container}>
      <Text>{new Date().toString()}</Text>
      <Text>{I18nManager.isRTL ? "RTL" : "LTR"}</Text>
      <View style={{ marginVertical: 5 }} />
      <Button title="Reload app" onPress={() => Updates.reloadAsync()} />
      <View style={{ marginVertical: 5 }} />
      <Button title="Toggle RTL" onPress={() => toggleRTL()} />
      <StatusBar style="auto" />
    </View>
  );
}

https://github.com/brentvatne/updates-reload/blob/master/App.js 这是我唯一的工作方式。当我尝试在 useEffect 中自动重新加载应用程序时 - 它崩溃了,所以我制作了一个单独的屏幕,要求用户按下按钮重新加载应用程序

【讨论】:

    【解决方案4】:

    如果你使用react-native-code-push库,你可以用这个重启;

    import CodePush from 'react-native-code-push';
    CodePush.restartApp();
    

    【讨论】:

    • 错误:undefined is not an object (evaluating 'A.default.restartApp')
    • 你链接了吗
    • 我使用yarn来安装这个包。这个需要链接吗?
    • 如果您在 AppCenter 上没有任何捆绑版本,代码推送将不起作用,并且可能在发布构建时崩溃。使用 RNRestart 包!
    • OP 明确指出使用了 Expo。 Expo 中无法链接,因此需要链接的包将无法工作
    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 2020-03-11
    • 2022-10-15
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2018-08-20
    • 2023-01-15
    相关资源
    最近更新 更多