我有几个地方有重复的代码,因为 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从来没有被调用过。
我怎样才能实现这种恒定的造型?
谢谢
您不能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,它不可能是恒定的,因为它是自适应的。
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |