在Flutter中保持所有常数的最佳实践是什么?

Man*_*ath 13 static const dart flutter

什么是最佳编程实践

在Flutter中创建一个常量类

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

class Constants {
static const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
}
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 21

尽管方面没有技术问题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;
}
Run Code Online (Sandbox Code Playgroud)

然后插入到应用程序的根目录:

void main() {
  runApp(
    MyConstants(
      child: MyApp(),
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)

并这样使用:

@override
Widget build(BuilContext context) {
  return Text(MyConstants.of(context).successMessage);
}
Run Code Online (Sandbox Code Playgroud)

它比的代码多一点static const,但具有许多优点:

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

但同时:

  1. 不会消耗更多的内存(继承的小部件通常创建一次)
  2. 是高性能的(获得InheritedWidget为O(1))

  • “Flutter 往往没有任何全局/静态变量并使用 InheritedWidget”。但这句话是在哪里说的呢?我来自传统的 Java 开发,这感觉令人难以置信...... (3认同)
  • Dart 文档明确指出“避免定义仅包含静态成员的类”。https://dart.dev/guides/language/ effective-dart/design (3认同)
  • 但在同一页上,它还说:“但是,这不是一个硬性规则。对于常量和类似枚举的类型,将它们分组到一个类中可能是很自然的。” 这意味着可以在类中存储静态字符串或颜色变量 (3认同)
  • @Wecherowski 这是 Flutter 所隐含的。与 InheritedWidget 相比,静态变量非常非常少。不过你可以使用任何你喜欢的东西。 (2认同)
  • “Flutter 往往没有任何全局/静态变量并使用 InheritedWidget”。根据定义,常量没有变量。因此我不明白你试图用 InheritedWidget 解决什么问题。 (2认同)

Ani*_*udh 13

我首选的解决方案是制作自己的Dart库。

制作一个名为的新dart文件constants.dart,并添加以下代码:

library Constants;

const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
Run Code Online (Sandbox Code Playgroud)

然后将以下import语句添加到需要访问常量的任何dart文件的顶部:

import 'constants.dart' as Constants;
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用以下语法轻松访问常量:

String a = Constants.SUCCESS_MESSAGE;
Run Code Online (Sandbox Code Playgroud)

  • 这看起来非常干净和简单。我的应用程序中也使用了这种方法。 (9认同)
  • 我的方法非常相似:我只有一个名为“constants”的文件夹,里面有一堆文件,“constants.dart”作为导入文件,然后在 lib 根目录本身中有“constants.dart”,里面有一行`导出“constants/constants.dart”;`。然后我刚刚在 VSCode 中创建了一个带有前缀“_iconst”的快捷方式片段,它为我创建了这样的导入“import 'package:<your_app_name>/constants.dart' as Constants;” (2认同)
  • 如果你想导入像 JS 这样的单个常量怎么办? (2认同)
  • 有用的答案,但是,建议在指定库前缀时使用“lowercase_with_underscores”。 (2认同)

Lee*_*ee3 10

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

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

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

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

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

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

...
Run Code Online (Sandbox Code Playgroud)

然后,import该文件在需要使用常量的任何地方都可以通过常量的名称直接访问。


Gün*_*uer 7

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

  • 为什么你这么想?区别在于 const 使其成为可执行文件的数据部分的一部分,而非 const 使代码可以创建代码部分的实例部分(当编译为本机代码时)。创建实例后,这将需要更多内存用于非常量。Dart 还规范化了 const 值。如果您使用相同的参数值多次调用 const 构造函数,并分布在您的应用程序代码中,则每次都会返回相同的实例。 (2认同)
  • 在运行时创建对象的代码指令不会占用更少的空间。只要您不添加大 BLOBS,这就不会成为问题,并且您也无法在 for 循环中创建 const。如果您需要单独手动添加每个常量,您将很难使其显示在内存使用情况中。 (2认同)

Mah*_*i19 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
   
Run Code Online (Sandbox Code Playgroud)

然后在需要的类中导入constants.dart文件,直接使用。


Chi*_*ong 5

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

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

在此处输入图片说明

与投票最多的答案相比,它的一个小优势是在 Android Studio 中,您可以在代码中键入类名Color,Android Studio 将能够建议自动导入Color类。这对于投票最多的答案是不可能的。

  • 真的。事实上我的 IDE 无法识别它,这真是令人沮丧。无法自动导入并且必须键入“导入”只是这次还没有完成。 (2认同)