我找不出设置一些常量(主要是字符串)的最佳方法。目前,我使用的是一个constants.dart文件,其中只定义了const变量,并在需要时导入它。没有类或任何东西,只有一个空白的dart文件。然而,这是可行的,我最近使用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,
),
);
})简单的解决方案是不使用常量,只在这些位置创建列表,我认为只使用了两次,但更好的做法是将其拔出,因为它被多次使用
发布于 2020-05-04 05:06:05
你可以试试。
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
https://stackoverflow.com/questions/61581201
复制相似问题