带有提供程序包的Flutter常量文件

时间:2020-05-03 20:30:29

标签: flutter

我在找出设置某些常量(主要是字符串)的最佳方法时遇到了麻烦。目前,我正在使用constants.dart文件,该文件中定义了const变量,并在需要时将其导入。没有课程或任何内容,只有空白的飞镖文件。这行得通,但是我最近在Android Studio中使用Flutter Intl插件实现了本地化。我已完成所有工作,可以执行类似S.of(context).settings的操作,它会从正确的文件中获取翻译。我的问题来自constants.dart文件中包含的一些常量字符串列表。我在很多地方都使用它们来进行选项选择。他们看起来像这样:

const playType = [
  'RP/Story Focused',
  'Battle/Combat Focused',
  'Puzzles and Challenges',
  'Exploration/Travel',
];
const length = [
  'One Shot',
  '2-5 Sessions',
  '5-10 Sessions',
  'On-going Campaign',
];

我无法将字符串更改为Intl引用,因为没有要传递的上下文。不确定如何设置要加载的类,但不确定如何设置并使用提供程序包进行加载。

编辑: 这是常量文件。与提供者进行调用很好。问题是当我需要在列表中的字符串上使用本地化时

import 'package:scryer/generated/l10n.dart';

class Constants {
  Constants._();
  static final instance = Constants._();

  static List<String> playType = [
    S.of(context).rpstoryFocused,//need a reference to a context
    'Battle/Combat Focused',
    'Puzzles and Challenges',
    'Exploration/Travel',
  ];
  static const length = [
    'One Shot',
    '2-5 Sessions',
    '5-10 Sessions',
    'On-going Campaign',
  ];
}

在这里,我如何在实际页面上调用常量。其按下后的按钮会转到新屏幕,该屏幕可以是多选复选框列表或单选单选按钮列表。我将常量作为列表的参数传递

MaterialPageRoute(builder: (context) {
  return MultiSelectScreen(
    args: MultiSelectArguments(
      label: S.of(context).selectPreferredPlayStyle,
      options: playType, //this is the constants list reference
      selections:
        profile.playType,
    ),
  );
})

简单的解决方案是不使用常量,而只在这些位置创建列表,我只使用过两次,但更好的做法是将其拔出,因为它已被多次使用

1 个答案:

答案 0 :(得分:0)

您可以尝试。

class Constants {
   final BuildContext context;
   Constants(@required this.context);
 //  static final instance = Constants._();     // to make class a singleton

static  const playType = [
    'RP/Story Focused',
    'Battle/Combat Focused',
    'Puzzles and Challenges',
    'Exploration/Travel',
  ];
static const length = [
    'One Shot',
    '2-5 Sessions',
    '5-10 Sessions',
    'On-going Campaign',
 ];

}

然后,在您项目的根目录中,应提供此类;

void main() {

/** WidgetsFlutterBinding.ensureInitialized() is required in Flutter v1.9.4+ before using any plugins if the code is executed before runApp. */
  WidgetsFlutterBinding.ensureInitialized();

     runApp( Provider( 
       create: (context) => Constants(context),
       child: MyApp(),
       ),
   );

}

您将能够在小部件树下方的任何BuildContext中访问这些常量,如下所示;

final Contants constants = Provider<Constants>.of(context);

你得到的长度常数就像; constants.length