我在几个地方都有重复的代码,用于BoxDecoration
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(5),
boxShadow: [
BoxShadow(
color: Theme.of(context).hintColor.withOpacity(0.15),
offset: Offset(0, 3),
blurRadius: 10)
],
),
因此,我想将
BoxDecoration
提取到单独的dart文件中并重复使用。就像是
static const boxDecoration = BoxDecoration(...);
然后用它
final container = Container(
decoration: boxDecoration
)
但是我在一些事情上陷入了困境:
1.如果我将其放在仅包含常量的文件中,则仍然需要访问
context
,例如在Theme.of(context).primaryColor
中,只能从build(Context)
方法中检索2.然后,我创建一个新的无状态窗口小部件
import 'package:flutter/material.dart';
class FlutterTemplateStyle extends StatelessWidget {
static var boxDecoration;
@override
Widget build(BuildContext context) {
boxDecoration = BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(5),
boxShadow: [
BoxShadow(
color: Theme.of(context).hintColor.withOpacity(0.15),
offset: Offset(0, 3),
blurRadius: 10)
],
);
return Container();
}
}
并尝试访问
decoration: FlutterTemplateStyle.boxDecoration
,它不起作用。我想这是因为从未调用build
。如何实现这种持续的样式?
谢谢
最佳答案
您不能在任何方法调用中将const
与一起使用,因为无法在编译时评估方法-这是const
值的要求。
如果您知道primaryColor
是常数,不会改变,并且永远不想动态改变装饰的颜色,则可以指定不带主题的颜色:color: const Color(0xfef1d2e1)
。
否则,您不想使用const
。如果您从不重新分配变量,则可能要使用final
,但是,如果您需要访问context
,那将不起作用。
话虽如此,您可能只想创建一个返回装饰的函数,因此可以在多个地方使用它:
BoxDecoration myAwesomeBoxDecoration(BuildContext context) => BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(5),
boxShadow: [
BoxShadow(
color: Theme.of(context).hintColor.withOpacity(0.15),
offset: const Offset(0, 3),
blurRadius: 10,
),
],
);
让我解释一下为什么我相信将BoxDecoration
设为常量的想法是违反直觉的:
装饰的颜色取决于应用程序的主题,这完全是在运行时创建的。这意味着为了使BoxDecoration
适应Theme
,它不能是恒定的,因为它是自适应的。