Определение пользовательских виджетов
Самый простой и, вероятно, самый элегантный подход - определить пользовательские виджеты, например MyRaisedButton
, который внутренне использует RaisedButton
с правильными размерами.
class MyRaisedButton extends StatelessWidget {
MyRaisedButton({
this.child,
this.onPressed,
});
final Widget child;
final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
return RaisedButton(
padding: ...,
onPressed: onPressed,
child: child
);
}
}
В большинстве случаев это работает на удивление хорошо.
Однако, если вы все еще хотите сохранить гибкость своих виджетов (возможность передавать множество параметров настройки конструктору), ваше общее определение виджета быстро становится очень длинным, потому что вам нужно перенаправить все параметры в RaisedButton
.
В этом случае имеет смысл на самом деле делиться значениями в приложении.
Фактическое распределение значений по всему приложению
Конечно, такой подход тоже возможен.
Благодаря открытости Flutter, мы можем просто посмотреть на , как реализован Theme
, и скопировать этот код, чтобы создать собственный виджет, который функционирует так же, как Theme
.
Вот урезанная версия:
@immutable
class MyThemeData {
MyThemeData({
this.myPadding,
this.myColor,
this.myString
});
final Padding myPadding;
final Color myColor;
final String myString;
}
class MyTheme extends StatelessWidget {
MyTheme({
Key key,
@required this.data,
@required this.child
}) : super(key: key);
final MyThemeData data;
final Widget child;
static MyThemeData of(BuildContext context) {
return (context.ancestorWidgetOfExactType(MyTheme) as MyTheme)?.data;
}
@override
Widget build(BuildContext context) => child;
}
Теперь вы можете просто обернуть MaterialApp
в MyTheme
виджет:
MyTheme(
data: MyThemeData(
myPadding: ...,
myColor: ...,
...
),
child: ... (here goes the MaterialApp)
)
Тогда в любом месте вашего приложения вы можете написать MyTheme.of(context).myPadding
.
Вы можете адаптировать класс MyThemeData
к вашим потребностям, сохраняя все, что вы хотите.