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

时间:2019-01-07 06:03:57

标签: static dart flutter const

什么是最佳编程实践

  

在Flutter中创建常量类

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

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

10 个答案:

答案 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相比,它的代码更多,但具有许多优点:

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

但是同时:

  1. 不消耗太多内存(继承的小部件通常创建一次)
  2. 是表演者(获得InheritedWidget为O(1))

答案 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.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";
}

答案 4 :(得分:3)

我注意到这里的答案有些混乱,所以我想我会尝试清除一些东西。

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

如@Abhishek Jain所指出的那样,library关键字对于此方法有效不是必需的。尽管library关键字可以与partpart 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

在下面的类中对常量,常量和类似枚举的类型进行分组是一种好习惯:

enter image description here

相对于投票最多的答案,这有一个小优势,那就是在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 等。我不需要它。

enter image description here

用法:

Column(
      children: [
          Text('Hello World' ,style: Constant.myStyle,),
          IconButton(icon: Constant.myIcon, onPressed: (){} ),
          Divider(color: Constant.myColor,)
                ],
              ),

输出:

enter image description here

<块引用>

不要忘记导入包含 常量,在我这里的例子中,它将是 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;

enter image description here

=> 用法:

  Container(
    color: backgroundColor(context),
    child: Text('With context'),
  ),


  //or


  Container(
    color: colorB,
    child: Text('With context'),
  ),

enter image description here