我在找出设置某些常量(主要是字符串)的最佳方法时遇到了麻烦。目前,我正在使用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,
),
);
})
简单的解决方案是不使用常量,而只在这些位置创建列表,我只使用过两次,但更好的做法是将其拔出,因为它已被多次使用
答案 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