什么是最佳编程实践
在Flutter中创建常量类
保留所有应用程序常量以便于参考。我知道Dart中有const
关键字用于创建常量字段,但是可以将static
与const一起使用,还是会在运行时创建内存问题。
class Constants {
static const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
}
答案 0 :(得分:20)
我首选的解决方案是创建自己的Dart库。
新建一个名为constants.dart
的飞镖文件,并添加以下代码:
library Constants;
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
然后将以下import语句添加到需要访问常量的任何dart文件的顶部:
import 'constants.dart' as Constants;
您可能需要运行flutter pub get
才能识别该文件。
现在,您可以使用以下语法轻松访问常量:
String a = Constants.SUCCESS_MESSAGE;
答案 1 :(得分:8)
尽管static const
没有任何技术问题,但从体系结构上来说,您可能希望采用其他方法。
Flutter倾向于不具有任何全局/静态变量,并使用InheritedWidget。
这意味着您可以写:
class MyConstants extends InheritedWidget {
static MyConstants of(BuildContext context) => context.inheritFromWidgetOfExactType(MyConstants);
const MyConstants({Widget child, Key key}): super(key: key, child: child);
final String successMessage = 'Some message';
@override
bool updateShouldNotify() => false;
}
然后将其插入到应用程序的根目录中
void main() {
runApp(
MyConstants(
child: MyApp(),
),
);
}
如此使用:
@override
Widget build(BuilContext context) {
return Text(MyConstants.of(context).successMessage);
}
与static const
相比,它的代码更多,但具有许多优点:
但是同时:
答案 2 :(得分:4)
对于所有常量,只需在lib文件夹或lib / util文件夹下创建constants.dart文件,然后按如下所示保留所有常量变量:
componentDidMount() {
if (!__DEV__) {
// Updates stuff
const checkForUpdate = async () => {
try {
const update = await Updates.checkForUpdateAsync();
if (update.isAvailable) {
await Updates.fetchUpdateAsync();
// ... notify user of update ...
await Updates.reloadAsync().then(() => SplashScreen.hide());
} else {
SplashScreen.hide();
}
} catch (e) {
// handle or log error
SplashScreen.hide();
}
};
checkForUpdate();
} else {
SplashScreen.hide();
}
}
然后在所需的类中导入constants.dart文件并直接使用。
答案 3 :(得分:3)
我喜欢这样组织我的“常量”。对于我来说,保持组织整齐并跟踪已经存在的内容比较容易。
我可以做这样的事情: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";
}
答案 4 :(得分:3)
我注意到这里的答案有些混乱,所以我想我会尝试清除一些东西。
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.dart 文件中,在顶层定义常量。
// constants.dart
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
...
然后,import
是需要使用常量的任何地方的文件,并可以通过常量的名称直接访问。
答案 5 :(得分:2)
完全由您决定。
使用静态没有缺点。
实际上,班级中的字段必须df1 = pd.DataFrame({'level': df[['level01', 'level02']].values.ravel(),
'value': df[['value01', 'value02']].values.ravel()})
df2 = (df1.query('value == 0')
.groupby('level')
.size()
.reset_index(name='value'))
。
答案 6 :(得分:2)
引用https://dart.dev/guides/language/effective-dart/design
在下面的类中对常量,常量和类似枚举的类型进行分组是一种好习惯:
相对于投票最多的答案,这有一个小优势,那就是在Android Studio中,您可以在代码中键入类名 Color ,Android Studio将能够建议自动导入颜色类。投票最多的答案是不可能的。
答案 7 :(得分:2)
最佳解决方案是创建一个外部文件,您将在其中创建一个类,然后在其中添加所有常量。
在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 中。如果它只是关于 dart 对象,例如 int 、 String 等。我不需要它。
Column(
children: [
Text('Hello World' ,style: Constant.myStyle,),
IconButton(icon: Constant.myIcon, onPressed: (){} ),
Divider(color: Constant.myColor,)
],
),
不要忘记导入包含
常量,在我这里的例子中,它将是 constant.dart
。
答案 8 :(得分:0)
Dart文档明确表示“避免定义仅包含静态成员的类”。 dart.dev/guides/language/effective-dart/design
我使用的方法是创建一个或多个文件来存储这些常量。有时,当您的项目太大时,可能会有很多这样的项目,并且为了加载更少的数据,我更喜欢通过不同的上下文将它们分开,我将使用它们来创建单独的文件。 因此,我只导入要使用的内容。
答案 9 :(得分:0)
新建一个名为 constants.dart
的 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'),
),