我怎样才能在 react-native 中获得正确的 ColorScheme?

How can i get the right ColorScheme in react-native?

我在使用 Expo CLI 创建的新 react-native 应用程序中使用自定义挂钩通过 tailwindcss 支持暗模式。具有暗模式逻辑的 TailwindProvider 如下所示:

const TailwindProvider: React.FC = ({ children }) => {
  const [currentColorScheme, setcurrentColorScheme] = useState(Appearance.getColorScheme());
  console.log("CurrentColorScheme:", currentColorScheme);
  const isDarkMode = currentColorScheme == "dark";
  const tw = (classes: string) => tailwind(handleThemeClasses(classes, isDarkMode))
  return <TailwindContext.Provider value={{ currentColorScheme, setcurrentColorScheme, tw, isDarkMode }}>{children}</TailwindContext.Provider>;
}

如您所见,我使用 react-native 中的 Appearance.getColorScheme() 方法来获取当前的 ColorScheme。但是在 iOS 和 Android 上,在调试和生产模式下,我总是得到 light 而不是 dark

我该如何解决这个问题?

useState(Appearance.getColorScheme()) 的问题是它只会在应用程序加载时检查一次。您可以尝试使用 useColorScheme() 挂钩来保持最新状态:

// ...
import { useColorScheme } from 'react-native';

const TailwindProvider: React.FC = ({ children }) => {
  const currentColorScheme = useColorScheme();
  console.log({ currentColorScheme });
  const isDarkMode = currentColorScheme === "dark";
  const tw = (classes: string) => tailwind(handleThemeClasses(classes, isDarkMode));
  return <TailwindContext.Provider value={{ currentColorScheme, tw, isDarkMode }}>{children}</TailwindContext.Provider>;
}

据说 'light' 在调试和生产代码中都被 return 编辑了。但是,仅 returning 'light' 的一个可能原因是使用了 Chrome 调试。 根据文档页面:[https://reactnative.dev/docs/appearance][1]

"注意:使用 Chrome 进行调试时,getColorScheme() 将始终 return 点亮。"

这也适用于 useColorScheme() 挂钩(如果使用)。

此外,如果 App.json,IOS 和 Android 的 userInterfaceStyle 都应设置为自动。