跳至主要内容

CupertinoTabBar 需要 Localizations 父级

摘要

#

CupertinoTabBar 的实例必须具有 Localizations 父级才能提供本地化的 Semantics 提示。尝试在没有本地化的情况下实例化 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 需要本地化。

在此更改之前,提供给 CupertinoTabBarSemantics 提示是一个硬编码的字符串“tab, $index of $total”。语义提示的内容也从原始字符串更新为英文的“Tab $index of $total”。

如果您的CupertinoTabBar位于CupertinoApp的范围内,则DefaultCupertinoLocalizations已实例化,并且可能满足您的需求,无需对现有代码进行任何更改。

如果您的CupertinoTabBar不在CupertinoApp内,您可以使用Localizations小部件提供您选择的本地化。

迁移指南

#

如果您看到'localizations != null'断言错误,请确保为您的CupertinoTabBar提供了语言环境信息。

迁移前的代码

dart
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提供本地化)

dart
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小部件提供本地化)

dart
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