CupertinoTabBar 需要 Localizations 父級
概述
#CupertinoTabBar 的例項在例項化時必須有一個 Localizations 父級,以便提供本地化的 Semantics 提示。嘗試在沒有 localizations 的情況下例項化 CupertinoTabBar 會導致斷言,如下所示:
CupertinoTabBar requires a Localizations parent in order to provide an appropriate Semantics hint
for tab indexing. A CupertinoApp provides the DefaultCupertinoLocalizations, or you can
instantiate your own Localizations.
'package:flutter/src/cupertino/bottom_tab_bar.dart':
Failed assertion: line 213 pos 7: 'localizations != null'背景
#為了支援本地化的語義資訊,CupertinoTabBar 需要 localizations。
在此更改之前,提供給 CupertinoTabBar 的 Semantics 提示是一個硬編碼的字串“tab, $index of $total”。語義提示的內容也從最初的字串更新為英語中的“Tab $index of $total”。
如果您的 CupertinoTabBar 位於 CupertinoApp 的作用域內,則 DefaultCupertinoLocalizations 已經被例項化,並且可能滿足您的需求,而無需更改現有程式碼。
如果您的 CupertinoTabBar 不在 CupertinoApp 內,您可以使用 Localizations widget 提供您選擇的 localizations。
遷移指南
#如果您看到 'localizations != null' 斷言錯誤,請確保正在為您的 CupertinoTabBar 提供 locale 資訊。
遷移前的程式碼
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 提供 localizations)
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 widget 提供 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