Flutter как получить материал 3 тональные палитры

Используя пользовательские цвета конструктора тем материала 3, у нас есть 4 цвета, которые нам нужно выбрать: первичный, вторичный, третичный, нейтральный.

Затем сайт генерирует полную как светлую, так и темную схему, основанную на цветах.

После добавления файла материала в приложение мы можем использовать их так

      Theme.of(context).colorScheme.primary;

В нижней части конструктора тем пользовательских материалов 3 есть часть о тональных палитрах

Хотелось бы использовать сгенерированные тональные палитры.

я пыталсяTheme.of(context).colorScheme.primary[50];иTheme.of(context).colorScheme.primary.shade50;Но это не работает.

Как я могу использовать сгенерированную тональную палитру материала 3?.

3 ответа

Отвечать:

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

Добавьте следующий пакет:

Вставьте свой основной цвет, чтобы получить тональную палитру основного цвета.

          TonalPalette primaryTonalP = toTonalPalette(_primaryColor); 
    primaryTonalP.get(50); // Getting the specific color


    TonalPalette toTonalPalette(int value) {
      final color = Hct.fromInt(value);
      return TonalPalette.of(color.hue, color.chroma);
    }

И повторить для каждого основного цвета в материале 3 цвета


Бонус:

Вы также можете программно сгенерировать всю тему материала 3 в приложении из 5 цветов.

Нейтральный слева отличается от сгенерированного нейтрального, как показано на изображении.

Вам понадобятся следующие пакеты: dynamic_color, material_color_utilitiesmaterial_color_utilities

Вставьте свои значения в_primaryColor,_secondaryColor,_tertiaryColor,_neutralColor,_neutralVariantColor

          import 'package:dynamic_color/dynamic_color.dart';
    import 'package:flutter/material.dart';
    import 'package:material_color_utilities/material_color_utilities.dart';

    ThemeData get themeData {
        List<int> colors = <int>[
          ...toTonalPalette(_primaryColor).asList,
          ...toTonalPalette(_secondaryColor).asList,
          ...toTonalPalette(_tertiaryColor).asList,
          ...toTonalPalette(_neutralColor).asList,
          ...toTonalPalette(_neutralVariantColor).asList,
        ].toList();
    
        ColorScheme colorScheme =
            CorePaletteToColorScheme(CorePalette.fromList(colors))
                .toColorScheme(brightness: brightness);
    
        return ThemeData(
          useMaterial3: true,
          colorScheme: colorScheme,
        );
      }
    
    TonalPalette toTonalPalette(int value) {
        final color = Hct.fromInt(value);
        return TonalPalette.of(color.hue, color.chroma);
    }

Добавьте пакет material_color_utilities

      void createTonalPalette(BuildContext context) {
  
  // Generate palette for primary
  TonalPalette primaryTonalP =
      toTonalPalette(Theme.of(context).colorScheme.primary.value);
  TonalPalette secondaryTonalP =
      toTonalPalette(Theme.of(context).colorScheme.secondary.value);

  TonalPalette tertiaryTonalP =
      toTonalPalette(Theme.of(context).colorScheme.tertiary.value);

  primaryTonalP.get(50); // Example how to use
}

TonalPalette toTonalPalette(int value) {
  final color = Hct.fromInt(value);
  return TonalPalette.of(color.hue, color.chroma);
}

Основываясь на других ответах, вы также можете написать удобное расширение для Color следующим образом:

      import 'package:material_color_utilities/material_color_utilities.dart';

extension Material3Palette on Color {
  Color tone(int tone) {
    assert(tone >= 0 && tone <= 100);
    final color = Hct.fromInt(value);
    final tonalPalette = TonalPalette.of(color.hue, color.chroma);
    return Color(tonalPalette.get(tone));
  }
}

// Usage
Theme.of(context).colorScheme.primary.tone(50);
Другие вопросы по тегам