【问题标题】:react-native-navigation theming with styled-components带有样式组件的 react-native-navigation 主题
【发布时间】:2018-03-24 10:48:39
【问题描述】:

我正在与 styled-components 合作处理我的 react-native 项目。我们使用react-native-navigation 在应用程序中执行导航。所以问题是如何在这种应用程序中从样式组件中实现主题模式? 问题是,要根据样式组件执行主题化的想法,我必须将我的顶级组件包装在 <ThemeProvider /> 中,如下所示:

<ThemeProvider theme={theme}>
  <App />
</ThemeProvider>

但是使用 react-native-navigation 我没有顶级组件。它有屏幕的概念,所以应用入口会是这样的:

registerScreens(); // this is where you register all of your app's screens

// start the app
Navigation.startSingleScreenApp({
  screen: { ... },
  drawer: { ... },
  passProps: { ... },
  ...
});

【问题讨论】:

    标签: react-native styled-components react-native-navigation


    【解决方案1】:

    答案很简单。由于 react-native-navigation 的 registerComponent 有可能将 redux store 和 Provider 作为 props 传递:

    Navigation.registerComponent('UNIQUE_ID', () => YourComponent, store, Provider);
    

    我们可以使用 redux 和 styled-components Providers 创建我们的自定义 Provider 并将这个自定义提供程序传递给 registerComponent,如下所示:

    import { Provider } from 'react-redux';
    import { ThemeProvider } from 'styled-components';
    import theme from './theme';
    
    const Provider = ({ store, children }) => (
      <Provider store={store}>
        <ThemeProvider theme={theme}>
          {children}
        </ThemeProvider>
      </Provider>
    );
    
    export default Provider;
    

    更多详情请看#1920

    【讨论】:

      【解决方案2】:

      我认为你可以这样做

      function wrap(Component) {
          return function () {
              return (
                  <ThemeProvider theme={theme}>
                      <Component />
                      <AnotherComponent/>
                  </ThemeProvider>
              );
          };
      }
      
      function registerScreens(store, Provider) {
          Navigation.registerComponent('app.SomeScreen', () =>  wrap(SomeScreen), store, Provider);
          // more screens...
      }
      

      【讨论】:

      • 感谢您的回答。这绝对是一个选项,但这意味着我必须用这个 HOC 包裹所有的屏幕。我正在寻找一些解决方案,例如为 redux Provider 制作的解决方案。并且有办法做到这一点。 (看#1920
      猜你喜欢
      • 2021-08-06
      • 2021-01-27
      • 2017-08-08
      • 2021-06-14
      • 2017-11-28
      • 2021-05-22
      • 1970-01-01
      • 2017-05-16
      • 2021-01-06
      相关资源
      最近更新 更多