В моем приложении Flutter я объявляю ThemeData
с помощью colorSchemeSeed
:
return MaterialApp(
...
theme: ThemeData(
useMaterial3: true,
visualDensity: VisualDensity.adaptivePlatformDensity,
colorSchemeSeed: Colors.blueGrey,
...
floatingActionButtonTheme: FloatingActionButtonThemeData(
backgroundColor: ?
),
),
...
);
Я хотел бы переопределить backgroundColor
FloatingActionButton
, используя tertiaryContainer
цвет.
В любом другом месте кода я могу установить для этого свойства значение FloatingActionButton
:
backgroundColor: Theme.of(context).colorScheme.tertiaryContainer,
Однако мне хотелось бы переопределить это свойство непосредственно в объявлении темы, чтобы мне не приходилось делать это везде и чтобы я не определял виджет специально.
Возможно ли это сделать? Если да, то каким образом? Заранее спасибо!
Вы можете определить первую переменную тему и повторно использовать ее:
final theme = ThemeData(
useMaterial3: true,
visualDensity: VisualDensity.adaptivePlatformDensity,
colorSchemeSeed: Colors.blueGrey,
);
MaterialApp(
return theme.copyWith(
floatingActionButtonTheme: FloatingActionButtonThemeData(
backgroundColor: theme.colorScheme.tertiaryContainer,
),
),
);
Я бы сказал, что правильный способ сделать это, не полагаясь на предопределенную переменную, — использовать Builder
в качестве дочернего элемента MaterialApp
и получить доступ к унаследованной теме с помощью Theme.of(context)
.
return MaterialApp(
theme: ThemeData(
useMaterial3: true,
visualDensity: VisualDensity.adaptivePlatformDensity,
colorSchemeSeed: Colors.blueGrey,
),
home: Builder(builder: (context) {
final theme = Theme.of(context);
return Theme(
data: theme.copyWith(
floatingActionButtonTheme: FloatingActionButtonThemeData(
backgroundColor: theme.colorScheme.tertiaryContainer,
),
),
child: MyHomePage(),
);
}),
);
Или вместо использования Builder
мы также можем создать новый StatelessWidget
, который будет служить модификатором темы перед вставкой фактического приложения в дерево виджетов (как дочернего элемента этого виджета).
Хотя, конечно, подход с общими переменными тоже работает.