Theme.of(context) 作为 const

Tim*_*thy 2 dart flutter

我有几个地方有重复的代码,因为 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)
                    ],
                  ),
Run Code Online (Sandbox Code Playgroud)

所以我想将其提取BoxDecoration到单独的 dart 文件中并重新使用。
就像是

static const boxDecoration = BoxDecoration(...);
Run Code Online (Sandbox Code Playgroud)

然后使用它

final container = Container(
decoration: boxDecoration
)
Run Code Online (Sandbox Code Playgroud)

但是我遇到了一些问题: 1. 如果我把它放在只包含常量的文件中,我仍然需要访问context,例如 in 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();
  }
}

Run Code Online (Sandbox Code Playgroud)

并尝试访问decoration: FlutterTemplateStyle.boxDecoration,这不起作用。我想这是因为build从来没有被调用过。

我怎样才能实现这种恒定的造型?

谢谢

cre*_*not 5

您不能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,
        ),
      ],
    );
Run Code Online (Sandbox Code Playgroud)

让我解释一下为什么我认为让你BoxDecoration成为常量的想法是违反直觉的:

您的装饰颜色取决于您的应用程序的主题,它完全是在运行时创建的。这意味着为了让你BoxDecoration适应Theme,它不可能是恒定的,因为它是自适应的