我在几个地方都有重复的代码,用于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,它不能是恒定的,因为它是自适应的。

08-28 19:56