React Native 如何重新启动应用程序(响应本机和expo)

b09cbbtk  于 2022-11-25  发布在  React
关注(0)|答案(6)|浏览(501)

我使用博览会,所以我没有访问android文件夹。
我想第一次重新启动我的应用程序。我该怎么做?
我使用了react-native-restart,但没有工作,现在出现错误:
null不是一个对象(评估'x.default.restart;)
代码:

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

如何重新启动应用程序?

gxwragnw

gxwragnw1#

我已经有一个多月的相同问题,没有帮助我,所以我开发了一个库来完成这一点,简单安装它使用:

npm i fiction-expo-restart

然后导入它,如下所示:

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

然后当您要执行重新启动时,请用途:

Restart();

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

vohkndzv

vohkndzv2#

我也曾面临过同样的问题,并在某个地方找到了这个解决方案。
您可以尝试从expo使用Updates,如下所示:

import { Updates } from 'expo';

Updates.reload();
jogvjijk

jogvjijk3#

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中自动重新加载应用程序时-它崩溃了,所以我做了一个单独的屏幕,要求用户按下按钮重新加载应用程序

gwbalxhn

gwbalxhn4#

对于Expo SDK 45+,
从“expo-updates”导入 * 作为更新,然后使用Updates.reloadAsync()
fiction-expo-restart模块未更新

cbeh67ev

cbeh67ev5#

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

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

4jb9z9bj6#

我所做的是构建一个Restart组件,它不是const而是var。还有一个applyReload()函数,如果reload bool状态为true,它会将该var设置为空组件<></>,从而触发重新呈现。
重新渲染会将Restartvar恢复到其原始结构,但随后会创建一个新示例,从而有效地重新加载<Restart>标记中的所有内容:
我的应用程序tsx:

export default function App() {
  const [reload, setReload] = useState(false);

  type Props = { children: ReactNode };
  var Restart = ({ children }: Props) => {
    return <>{children}</>;
  };
  const applyReload = () => {
    if (reload) {
      Restart = ({ children }: Props) => {
        return <></>;
      };
      setReload(false);
    }
  };
  useEffect(applyReload);

  useEffect(() => {
    // put some code here to modify your app..

    // test reload after 6 seconds
    setTimeout(() => {
      setReload(true);
    }, 6000);
  }, []);

  return (
    <SafeAreaProvider>
      <SafeAreaView style={{ flex: 1 }}>
        <PaperProvider theme={appTheme}>
          <NavigationContainer theme={appTheme} documentTitle={{ enabled: false }}>
            <AppContext.Provider value={appContext}>
              <Restart>
                <MyMainAppComponent />
              </Restart>
            </AppContext.Provider>
          </NavigationContainer>
        </PaperProvider>
      </SafeAreaView>
    </SafeAreaProvider>
  );

I also added the 'setReload' state function to my '<AppContext.Provider>' so anywhere down my App it is possible to trigger the App reload.

相关问题