我认为有两种方法可以实现您想要的。
首先是创建一个将您映射sectionTitles
到您的国际字符串的函数,如下所示:
String getSectionTitle(BuildContext context, String title) {
if (title == "documentsSection") {
return S.of(context).documentsSection;
} else if (title == "favouritesSection") {
return S.of(context).favouritesSection;
} else if (title == "newsSection") {
return S.of(context).newsSection;
} else if (title == "settingsSection") {
return S.of(context).settingsSection;
}
}
并像这样使用:
...
itemBuilder: (context, index) {
return Text(
getSectionTitle(context, sectionTitles[index]),
);
},
...
第二个是用你的 intl 字符串创建一个数组:
List<String> sectionTitles = [
S.of(context).documentsSection,
S.of(context).favouritesSection,
S.of(context).newsSection,
S.of(context).settingsSection,
];
但是您需要在构建函数中创建它,因为您需要一个上下文:
@override
Widget build(BuildContext context) {
List<String> sectionTitles = [
S.of(context).documentsSection,
S.of(context).favouritesSection,
S.of(context).newsSection,
S.of(context).settingsSection,
];
return ...
itemBuilder: (context, index) {
return Text(
sectionTitles[index],
);
},
...
}
在不使用构建函数的上下文的情况下实现此目的的另一种方法是使用didChangeDependencies
on 可用的方法StatefulWidgets
,如下所示:
List<String> sectionTitles;
@override
void didChangeDependencies() {
super.didChangeDependencies();
sectionTitles ??= [
S.of(context).documentsSection,
S.of(context).favouritesSection,
S.of(context).newsSection,
S.of(context).settingsSection,
];
}
@override
Widget build(BuildContext context) {
return ...
itemBuilder: (context, index) {
return Text(
sectionTitles[index],
);
},
...
}
请注意,在这种情况下,您不能使用initState
,因为它不会提供已经可用的 intl 字符串的上下文,因此我们使用didChangeDependencies
.
如果你想知道它做了什么??=
,它只是检查一个变量(在这种情况下sectionTitles
)是否为空,如果是,它会将值分配给它。我们在这里使用它来避免sectionTitles
每次都重新定义。