最佳编程实践是什么
在 Flutter 中创建一个常量类
保留所有应用程序常量以便于参考。我知道const
Dart 中有用于创建常量字段的关键字,但是可以static
与 const 一起使用,还是会在运行时产生内存问题。
class Constants {
static const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
}
我首选的解决方案是制作自己的 Dart 库。
创建一个名为 的新 dart 文件constants.dart
,并添加以下代码:
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
编辑:99% 的情况下,您不需要使用library library_name;
文件顶部的语句明确命名您的 dart 库,而且您可能不应该(参考)。
即使您省略了这一行,您的文件仍将是库!它只会被隐式命名。
然后将以下导入语句添加到需要访问常量的任何 dart 文件的顶部:
import 'constants.dart' as Constants;
请注意,如果constants.dart
在不同的目录中,那么您需要constants.dart
在导入语句中指定路径。
编辑:lowercase_with_underscores
指定库前缀时使用。
在这个例子中:
您可以使用相对路径:
import '../assets/constants.dart' as constants;
或者来自 lib 目录的绝对路径:
import 'package:<your_app_name>/assets/constants.dart' as constants;
现在您可以使用以下语法轻松访问常量:
String a = Constants.SUCCESS_MESSAGE;
编辑
现在该标志--dart-define
已添加到 Flutter 的不同命令行中,以下答案不再适用。
相反,只需在您想要的任何地方声明常量,并可能参考其他答案。
虽然 没有技术问题static const
,但在架构上您可能希望以不同的方式进行操作。
Flutter 往往没有任何全局/静态变量并使用 InheritedWidget。
这意味着你可以写:
class MyConstants extends InheritedWidget {
static MyConstants of(BuildContext context) => context. dependOnInheritedWidgetOfExactType<MyConstants>();
const MyConstants({Widget child, Key key}): super(key: key, child: child);
final String successMessage = 'Some message';
@override
bool updateShouldNotify(MyConstants oldWidget) => false;
}
然后插入到您的应用程序的根目录:
void main() {
runApp(
MyConstants(
child: MyApp(),
),
);
}
并这样使用:
@override
Widget build(BuilContext context) {
return Text(MyConstants.of(context).successMessage);
}
这比 具有更多的代码static const
,但提供了许多优点:
但同时它:
参考https://dart.dev/guides/language/effective-dart/design
在类中分组、常量和类枚举类型是一个很好的做法,如下所示:
在 Android Studio 中自动导入很简单,您可以在其中键入类名Color,Android Studio 将能够建议自动导入Color类。
我注意到这里的答案有些混乱,所以我想我会尝试澄清一些事情。
Dart/Flutter 指南建议不要创建只包含静态成员的类,因为它不是必需的。有些语言,例如 Java 或 C#,不允许你在类之外定义函数、变量或常量,但 Dart 可以。因此,您可以简单地创建一个包含您要定义的常量的文件,例如constants.dart 。
正如@Abhishek Jain 所指出的,library
此方法不需要关键字即可工作。该library
关键字用于将发布以供其他项目使用的库,尽管它可以与多个文件一起使用part
并将part of
单个库分解为多个文件。但是,如果您需要,那么您的需求可能超出了 OP 的问题范围。
正如@ChinLoong 所指出的,创建一个对相关常量和类枚举类型进行分组的类在技术上是可以接受的。但是应该注意的是,这表明该指南是一个例外,因为它不是硬性规则。虽然这是可能的,但在 Dart 中,不赞成定义一个从不实例化的类。你会注意到定义 Color 常量的 Dart Color 类有一个构造函数,它除了一个整数值,允许实例化不是由常量定义的颜色。
总之,最符合 Dart 指南的方法是创建一个constants.dart文件或一个包含不同常量(strings.dart、styles.dart等)的多个文件的 constants 文件夹。在constants.dart文件中,在顶层定义常量。
// constants.dart
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
...
然后,import
需要使用常量的文件,并通过常量的名称直接访问。
这完全取决于你。
使用静态没有缺点。
实际上const
是类中的字段所必需的。
对于所有常量,只需在 lib 文件夹或 lib/util 文件夹下创建 constants.dart 文件,然后将所有常量变量保存如下:
const SUCCESS_MESSAGE=" You will be contacted by us very soon.";
// Api related
const apiBaseURL = "https://baseurl.com";
const userLoginApi = "login";
const userSignupApi = "signup";
// Shared Preference keys
const kDeviceName = "device_name";
const kDeviceUDID = "device_id";
// Asset Constants
const navBarLogoImage = "assets/images/home_images/sample.png
然后在需要的类中导入constants.dart文件并直接使用。
我喜欢以这种方式组织我的“常量”。我更容易保持井井有条并跟踪已经存在的内容。我可以做这样的事情:Tables.questions.id
和Tables.anwerOptions.orderIndex
class Tables {
static QuestionsTable get questions => QuestionsTable();
static AnswerOptionsTable get answerOptions => AnswerOptionsTable();
}
class QuestionsTable {
String get id => "id";
String get title => "question";
String get subtitle => "description";
String get inputFieldType => "answer_input_type";
String get answer => "answer";
}
class AnswerOptionsTable {
String get id => "id";
String get questionId => "question_id";
String get answerOption => "answer_option";
String get orderIndex => "order_index";
}
最好的解决方案是创建一个外部文件,您将在其中创建一个类,然后在其中添加所有常量。
在constant.dart
中,您将创建常量类
import 'package:flutter/material.dart';
class Constant {
static Color myColor = Colors.blue;
static Icon myIcon = Icon(Icons.search , color: Colors.red,);
static TextStyle myStyle = TextStyle(
fontSize: 17,
fontWeight: FontWeight.bold ,
color: Colors.green);
}
我必须导入
material.dart
文件constant.dart
,因为我创建了 Widget 类型常量。小部件包含在 material.dart 中。如果它只是关于飞镖对象,例如 int , String 等。我不需要它。
Column(
children: [
Text('Hello World' ,style: Constant.myStyle,),
IconButton(icon: Constant.myIcon, onPressed: (){} ),
Divider(color: Constant.myColor,)
],
),
不要忘记导入包含常量的文件库,在我的例子中,它将是
constant.dart
.
创建一个名为 的新 dart 文件constants.dart
,并添加以下代码:
这种方式为您提供带有(context)
或不带有的常量值(context)
:
=>有上下文:
import 'package:flutter/material.dart';
Color backgroundColor(context) {
return Theme.of(context).backgroundColor;
}
或者
=>没有上下文:
static Color colorB = Colors.blue;
=>用法:
Container(
color: backgroundColor(context),
child: Text('With context'),
),
//or
Container(
color: colorB,
child: Text('With context'),
),
Dart 文档明确指出“避免定义仅包含静态成员的类”。dart.dev/guides/language/effective-dart/design
我使用的方法是创建一个或多个文件来存储这些常量。有时,当你的项目太大时,它可能有很多,为了加载更少的数据,我更喜欢通过不同的上下文将它们分开,我会使用它们创建单独的文件。所以我只导入我会使用的那些。
我个人喜欢这个包flutter_gen 4.1.5添加常量不仅限于字符串,这个包还可以帮助你颜色,资产,字体等(总之你可以处理所有常量)
用于资产、字体、颜色的 Flutter 代码生成器——摆脱所有基于字符串的 API。