Как получить доступ к цвету темы внутри виджета Flutter: несколько методов, объясненных примерами кода

Чтобы получить цвет темы внутри виджета Flutter, вы можете использовать различные методы. Вот несколько примеров кода:

Метод 1: использование метода Theme.of

import 'package:flutter/material.dart';
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Color themeColor = Theme.of(context).colorScheme.primary;
    return Container(
      color: themeColor,
      child: Text('Widget with theme color'),
    );
  }
}

В этом методе вы используете Theme.of(context)для доступа к текущей теме, а затем получаете доступ к желаемому цвету через свойство colorScheme.

Метод 2: непосредственное использование ThemeData

import 'package:flutter/material.dart';
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ThemeData themeData = Theme.of(context);
    Color themeColor = themeData.colorScheme.primary;
    return Container(
      color: themeColor,
      child: Text('Widget with theme color'),
    );
  }
}

В этом методе вы извлекаете весь объект ThemeData, используя Theme.of(context), а затем получаете доступ к желаемому цвету из colorScheme>собственность.

Метод 3. Использование шаблона InheritedWidget

import 'package:flutter/material.dart';
class ThemeColorContainer extends InheritedWidget {
  final Color themeColor;
  ThemeColorContainer({
    required this.themeColor,
    required Widget child,
  }) : super(child: child);
  static ThemeColorContainer? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<ThemeColorContainer>();
  }
  @override
  bool updateShouldNotify(ThemeColorContainer oldWidget) {
    return themeColor != oldWidget.themeColor;
  }
}
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Color? themeColor = ThemeColorContainer.of(context)?.themeColor;
    return Container(
      color: themeColor,
      child: Text('Widget with theme color'),
    );
  }
}

В этом методе вы определяете пользовательский InheritedWidgetпод названием ThemeColorContainerдля распространения цвета темы по дереву виджетов. Затем вы можете получить доступ к цвету темы, используя ThemeColorContainer.of(context)?.themeColor.