120

最佳编程实践是什么

在 Flutter 中创建一个常量类

保留所有应用程序常量以便于参考。我知道constDart 中有用于创建常量字段的关键字,但是可以static与 const 一起使用,还是会在运行时产生内存问题。

class Constants {
static const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
}
4

11 回答 11

197

我首选的解决方案是制作自己的 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;
于 2019-08-02T02:24:51.200 回答
80

编辑

现在该标志--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,但提供了许多优点:

  • 适用于热重载
  • 易于测试和模拟
  • 可以用比常量更动态的东西替换,而无需重写整个应用程序。

但同时它:

  1. 不消耗更多内存(继承的小部件通常创建一次)
  2. 是高性能的(获得一个 InheritedWidget 是 O(1))
于 2019-01-07T09:15:00.713 回答
17

参考https://dart.dev/guides/language/effective-dart/design

在类中分组、常量和类枚举类型是一个很好的做法,如下所示:

在此处输入图像描述

在 Android Studio 中自动导入很简单,您可以在其中键入类名Color,Android Studio 将能够建议自动导入Color类。

于 2020-10-29T03:18:43.327 回答
13

我注意到这里的答案有些混乱,所以我想我会尝试澄清一些事情。

Dart/Flutter 指南建议不要创建只包含静态成员的类,因为它不是必需的。有些语言,例如 Java 或 C#,不允许你在类之外定义函数、变量或常量,但 Dart 可以。因此,您可以简单地创建一个包含您要定义的常量的文件,例如constants.dart 。

正如@Abhishek Jain 所指出的,library此方法不需要关键字即可工作。该library关键字用于将发布以供其他项目使用的库,尽管它可以与多个文件一起使用part并将part of单个库分解为多个文件。但是,如果您需要,那么您的需求可能超出了 OP 的问题范围。

正如@ChinLoong 所指出的,创建一个对相关常量和类枚举类型进行分组的类在技术上是可以接受的。但是应该注意的是,这表明该指南是一个例外,因为它不是硬性规则。虽然这是可能的,但在 Dart 中,不赞成定义一个从不实例化的类。你会注意到定义 Color 常量的 Dart Color 类有一个构造函数,它除了一个整数值,允许实例化不是由常量定义的颜色。

总之,最符合 Dart 指南的方法是创建一个constants.dart文件或一个包含不同常量(strings.dartstyles.dart等)的多个文件的 constants 文件夹。在constants.dart文件中,在顶层定义常量。

// constants.dart
 
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";

...

然后,import需要使用常量的文件,并通过常量的名称直接访问。

于 2020-11-11T22:20:38.090 回答
7

这完全取决于你。
使用静态没有缺点。
实际上const是类中的字段所必需的。

于 2019-01-07T06:34:27.150 回答
6

对于所有常量,只需在 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文件并直接使用。

于 2020-07-01T01:48:53.810 回答
3

我喜欢以这种方式组织我的“常量”。我更容易保持井井有条并跟踪已经存在的内容。我可以做这样的事情:Tables.questions.idTables.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";
}
于 2020-09-07T17:51:07.303 回答
3

最好的解决方案是创建一个外部文件,您将在其中创建一个类,然后在其中添加所有常量。

一个例子:

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.

于 2021-02-07T21:56:23.533 回答
1

创建一个名为 的新 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'),
  ),

在此处输入图像描述

于 2021-05-18T08:12:56.640 回答
0

Dart 文档明确指出“避免定义仅包含静态成员的类”。dart.dev/guides/language/effective-dart/design

我使用的方法是创建一个或多个文件来存储这些常量。有时,当你的项目太大时,它可能有很多,为了加载更少的数据,我更喜欢通过不同的上下文将它们分开,我会使用它们创建单独的文件。所以我只导入我会使用的那些。

于 2020-08-12T22:28:20.447 回答
0

我个人喜欢这个包flutter_gen 4.1.5添加常量不仅限于字符串,这个包还可以帮助你颜色,资产,字体等(总之你可以处理所有常量)

用于资产、字体、颜色的 Flutter 代码生成器——摆脱所有基于字符串的 API。

这是示例flutter_gen/example

于 2022-02-08T08:29:28.200 回答