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

react-native-elements 4.0.0-rc自定义主题未应用到组件如何解决

问题描述

创建自定义主题传入ThemeProvider后,主题未生效到react-native-elements组件,当前使用版本为4.0.0-rc。预期Button组件显示自定义的红色主色背景,实际显示默认蓝色;手动给组件传入theme属性可正常生效,需要实现无需手动给每个组件传参、自定义主题默认应用到所有组件的配置方案。

相关实现代码

自定义主题

import { createTheme } from '@rneui/themed';

export const theme = createTheme({
  lightColors: {
    primary: 'red',
    background: '#fff',
    platform: {
      web: {
        primary: 'red',
      },
    },
  },
  darkColors: {
    primary: 'red',
    background: '#000',
    platform: {
      web: {
        primary: 'red',
      },
    },
  },
  mode: 'light',
});

App.tsx

import { ThemeProvider } from '@rneui/themed';
import { registerRootComponent } from 'expo';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import Root from './Root';
import { theme } from './themed';

function App() {
  return (
    <SafeAreaProvider>
      <ThemeProvider theme={theme}>
        <Root />
      </ThemeProvider>
    </SafeAreaProvider>
  );
}

export default registerRootComponent(App);

Root.tsx(未生效版本)

import { Button } from '@rneui/base';
import { useTheme, useThemeMode } from '@rneui/themed';
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';

export default function Root() {
  const { theme } = useTheme();
  const { mode, setMode } = useThemeMode();

  return (
    <SafeAreaView style={styles.container}>
      <Text>Hello world!</Text>
      <Button
        color="primary"
        title={'Click me'}
        size="md"
        radius={'md'}
        onPress={() => setMode(mode === 'dark' ? 'light' : 'dark')}
      />
      <StatusBar style="auto" />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
  text: {
    marginTop: 10,
  },
});

手动给Button传入theme={theme}属性后样式可正常生效


解决方案

问题根源为组件导入路径错误:

  • 从@rneui/base导入的是未绑定主题上下文的基础组件,无法自动读取ThemeProvider下发的主题配置
  • 只有从@rneui/themed导入的组件,才会自动接入主题体系,默认应用自定义主题

修改Root.tsx中的Button导入语句即可修复:

// 错误写法:导入的基础组件不会自动应用主题
// import { Button } from '@rneui/base';
// 正确写法:导入带主题绑定的组件
import { Button } from '@rneui/themed';

修改后无需手动给每个组件传入theme属性,所有从@rneui/themed导入的组件都会自动读取全局主题配置。

补充:@rneui/base仅提供无样式绑定的基础原子组件,日常开发直接使用@rneui/themed导出的组件即可。


内容的提问来源于stack exchange,提问作者Lee Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:30:53