Как сделать собственную тему, используя Shoutem's StyleProvider, который правильно использует базовый INCLUDE

Я действительно люблю библиотеку тем shoutem, но мне трудно подключиться к рекурсивному ВКЛЮЧЕНИЮ, который прекрасно работает с базовым кодом (см. Код + документация здесь: https://github.com/shoutem/theme/blob/develop/src/Theme.js). Например, если у нас есть:

render() {
    return (
        <StyleProvider style={theme}>
            <View />
        </StyleProvider>
    );
}

const theme = _.merge(getTheme(), {
    'shoutem.ui.Text': {
        color: 'green',
    },
});

Это простое изменение цвета текста будет работать, но только для текстовых компонентов shoutem. Однако заголовок, заголовок, субтитры и т. Д. Все они извлекаются из атрибутов текста в библиотеке shoutem из-за включения. Использование простого _.merge(...) только перезаписывает сам компонент, но не все, на что оно может впоследствии повлиять. Похоже, мне нужно переписать атрибуты выше в дереве (например, текст), а затем заново создать тему, чтобы она влияла на всех "потомков", в которые она включена (например, заголовок и заголовок). Используя публично представленный API, возможно ли это как-то сделать в данный момент? Или есть какие-то вилки или утилиты, о которых вы знаете, которые выполняют это с вашей библиотекой.

1 ответ

E сть text свойство в корне темы пользовательского интерфейса shoutem по умолчанию, которое включено во все текстовые элементы ( https://github.com/shoutem/ui/blob/develop/theme.js#L292). Вы должны быть в состоянии выполнить ваш вариант использования, просто переопределив значения из этого свойства:

const theme = _.merge(getTheme(), {
  text: {
    color: 'green',
  },
});

Если вы хотите создать более сложную тему, вы можете использовать INCLUDE в вашем коде, а также. INCLUDE работает путем слияния всех значений из свойств темы верхнего уровня, на которые она нацелена. Вы можете использовать его для включения свойств из базовой темы, а также вы можете включить свои собственные пользовательские свойства:

import { INCLUDE } from '@shoutem/theme';

const theme = _.merge(getTheme(), {
  // Define a top level property to use in includes
  largeText: {
    fontSize: 20,
  },
  'shoutem.ui.Text': {
    // Include a text property from the base theme
    // and a largeText property defined above
    [INCLUDE]: ['text', 'largeText'],

    // Override the text color after all includes
    // have been resolved
    color: 'green',
  },
});

Иногда определенные компоненты определяют стили после разрешения INCLUDE, эти стили имеют более высокий приоритет и всегда будут переопределять стиль из INCLUDE. Чтобы изменить эти стили, вы можете использовать createSharedStyle помощник:

import { createSharedStyle } from '@shoutem/theme';

const textComponents = [
  'shoutem.ui.Heading',
  'shoutem.ui.Title',
  'shoutem.ui.Subtitle',
  'shoutem.ui.Text',
  'shoutem.ui.Caption',
];

const theme = _.merge(getTheme(), {
  ...createSharedStyle(textComponents, {
    color: 'green',
  },
});

Наконец, с помощью переменных темы можно выполнить некоторые более простые настройки, при вызове которых вы можете передавать пользовательские переменные. getTheme( https://github.com/shoutem/ui/blob/develop/theme.js#L55-L144).

Другие вопросы по тегам