无法在Flutter TabBarView中本地化字符串

时间:2019-07-18 19:23:17

标签: flutter localization

当我尝试在TabBarView中本地化字符串时,出现此错误:

NoSuchMethodError:方法“ translate”在null上被调用。接收者:null。尝试调用:translate(“ username)。

我使用以下代码行将键转换为本地化字符串:

AppLocalizations.of(context).translate('username')

此功能在我的应用程序的所有其他屏幕(除了此屏幕)上都很好用。有谁知道为什么它不起作用以及如何解决?

我已经尝试过的一些事情:

  • 传递主屏幕(包含所有TabBarViews的屏幕)的上下文

  • 在构建器中包装每个ListTile

  • 将ListView包装在构建器中

代码:

class AccountScreen extends StatelessWidget {
  final String username;
  final String email;
  final int points;

  AccountScreen(this.username, this.email, this.points);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Padding(
        padding: EdgeInsets.all(10),
        child: ListView(
          children: <Widget>[
            ListTile(
              title: Text(AppLocalizations.of(context).translate('username')),
              subtitle: Text(username),
            ),
            ListTile(
              title:
                  Text(AppLocalizations.of(context).translate('email_address')),
              subtitle: Text(email),
            ),
            ListTile(
              title: Text(AppLocalizations.of(context).translate('points')),
              subtitle: Text('$points'),
            ),
          ],
        ),
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:0)

我发现了同样的问题。但就我而言,是使用MaterialApp而不使用localizationsDelegates。 (我的意思是所有文件不只是main.dart)。

因此,我在所有小部件中的每个localizationsDelegates上添加了MaterialApp

例如

   MaterialApp(
      localizationsDelegates: [
        MainLocalizationsDelegate.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: AppBar(
            brightness: Brightness.light,
            bottom: TabBar(
              tabs: [
                Tab(text: MainLocalizations.of(context).food),
                Tab(text: MainLocalizations.of(context).car),
              ],
            ),
          ),
          body: TabBarView(
            children: [
              TabA(),
              TabB(),
            ],
          ),
        ),
      ),
    );

答案 1 :(得分:0)

问题在于,应用程序内部有多个MaterialApp小部件,这些小部件引起了有关本地化过程的一些冲突。删除冗余的MaterialApp小部件可解决此问题。