You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中使用RealmProvider报constructor不可调用错误求助

解决React Native中RealmProvider的"constructor is not callable"错误

错误原因

你在Navigation函数组件内部调用了createRealmContext,每次组件渲染时,这个调用都会重新生成一个全新的RealmProvider组件。React会把这个新生成的组件视为不同的构造函数,从而抛出"constructor is not callable"错误。

修复方案

将createRealmContext的调用移到组件外部,确保RealmProvider是一个稳定的组件引用,不会随组件渲染重复创建。

修改后的代码

import { createRealmContext } from '@realm/react';

const Tab = createBottomTabNavigator();
const Stack = createStackNavigator();

const appId = "";
const realmConfig = { id: appId, timeout: 10000 }
const TodoSchema = {
  name: 'Todo',
  primaryKey: '_id',
  properties: {
    _id: 'objectId',
    text: 'string'
  }
}

// 移到组件外部,只创建一次
const config = {
  schema: [TodoSchema],
};
const { RealmProvider } = createRealmContext(config);

const Navigation = () => {
  const scheme = useColorScheme();
  const isDarkMode = scheme === "dark";
  const logStatus = true;
 
  return (
    <NavigationContainer
      ref={navigationRef}
      onReady={() => {
        isReadyRef.current = true;
      }}
      theme={isDarkMode ? DarkTheme : LightTheme}
    >
      <RealmProvider>
        <Stack.Navigator screenOptions={{ headerShown: false }}>
          <>
            <Stack.Screen name={SCREENS.INSTALLMANUAL}>
              {(props) => <InstallManual {...props} />}
            </Stack.Screen>
            <Stack.Screen name={SCREENS.FORGET_PASSWORD}>
              {(props) => <ForgetPasswordScreen {...props} />}
            </Stack.Screen>
          </>
          <>
            <Stack.Screen name={SCREENS.HOME} component={HomeScreen} />
            <Stack.Screen name={SCREENS.DETAIL}>
              {(props) => <DetailScreen {...props} />}
            </Stack.Screen>

            <Stack.Screen name={SCREENS.SLIDESHOW}>
              {(props) => <SlideshowScreen {...props} />}
            </Stack.Screen>
          </>
        </Stack.Navigator>
      </RealmProvider>
    </NavigationContainer>
  );
};

export default Navigation;

动态配置的特殊处理

如果你的Realm配置需要根据组件内部状态动态变化(比如依赖isDarkMode),可以使用useMemo缓存createRealmContext的结果,避免每次渲染重新创建:

const Navigation = () => {
  const scheme = useColorScheme();
  const isDarkMode = scheme === "dark";
  const logStatus = true;

  // 用useMemo缓存,仅当依赖变化时重新创建
  const { RealmProvider } = useMemo(() => {
    const dynamicConfig = {
      schema: [TodoSchema],
      // 这里可以添加依赖isDarkMode的配置项
    };
    return createRealmContext(dynamicConfig);
  }, [isDarkMode]);
 
  // ... 其余代码不变
};

内容的提问来源于stack exchange,提问作者Tanmoy Sarker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:13:15