CupertinoTabBar 需要 Localizations 父级
摘要
#CupertinoTabBar
的实例必须具有 Localizations
父级才能提供本地化的 Semantics
提示。尝试在没有本地化的情况下实例化 CupertinoTabBar
将导致如下断言错误:
CupertinoTabBar 需要 Localizations 父级才能提供合适的语义提示来进行选项卡索引。CupertinoApp 提供 DefaultCupertinoLocalizations,或者您可以实例化您自己的 Localizations。
'package:flutter/src/cupertino/bottom_tab_bar.dart':
断言失败:第 213 行,第 7 个位置:'localizations != null'
背景
#为了支持本地化的语义信息,CupertinoTabBar
需要本地化。
在此更改之前,提供给 CupertinoTabBar
的 Semantics
提示是一个硬编码的字符串,“tab, $index of $total”。语义提示的内容也从原来的字符串更新为英文的“Tab $index of $total”。
如果您的 CupertinoTabBar
位于 CupertinoApp
的范围内,则 DefaultCupertinoLocalizations
已经实例化,并且可能满足您的需求,而无需对现有代码进行更改。
如果您的 CupertinoTabBar
不在 CupertinoApp
内,您可以使用 Localizations
组件提供您选择的本地化。
迁移指南
#如果您看到 'localizations != null'
断言错误,请确保正在向您的 CupertinoTabBar
提供区域设置信息。
迁移前的代码:
import 'package:flutter/cupertino.dart';
void main() => runApp(Foo());
class Foo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MediaQuery(
data: const MediaQueryData(),
child: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled),
label: 'Tab 1',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled_solid),
label: 'Tab 2',
),
],
currentIndex: 1,
),
);
}
}
迁移后的代码(通过 CupertinoApp
提供本地化):
import 'package:flutter/cupertino.dart';
void main() => runApp(Foo());
class Foo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoApp(
home: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled),
label: 'Tab 1',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled_solid),
label: 'Tab 2',
),
],
currentIndex: 1,
),
);
}
}
迁移后的代码(使用 Localizations
组件提供本地化):
import 'package:flutter/cupertino.dart';
void main() => runApp(Foo());
class Foo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Localizations(
locale: const Locale('en', 'US'),
delegates: <LocalizationsDelegate<dynamic>>[
DefaultWidgetsLocalizations.delegate,
DefaultCupertinoLocalizations.delegate,
],
child: MediaQuery(
data: const MediaQueryData(),
child: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled),
label: 'Tab 1',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.add_circled_solid),
label: 'Tab 2',
),
],
currentIndex: 1,
),
),
);
}
}
时间线
#包含的版本:1.18.0-9.0.pre
稳定版本:1.20.0
参考
#API 文档:
相关的 PR:
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。