dart flutter_localizations错误在空值上使用了错误检查运算符

ssgvzors  于 12个月前  发布在  Flutter
关注(0)|答案(2)|浏览(98)

我想用导航抽屉制作MyApp。当打开抽屉时,我得到了以下由flutter_localization发生的异常。
小部件库捕获异常=[_LocalizationsScope-[GlobalKey#9fbb0]]):用于空值的空校验运算符

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MaterialApp(
    localizationsDelegates: [
      AppLocalizations.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
    ],
    supportedLocales: [
      Locale('en'),
      Locale('ja'),
    ],
    home: MyPage(),
  ));
}

/// A simple app that loads an adaptive banner ad.
class MyPage extends StatefulWidget {
  const MyPage({super.key});

  @override
  MyPageState createState() => MyPageState();
}

class NavigationDrawer extends StatelessWidget {
  const NavigationDrawer({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => Drawer(
    child: SingleChildScrollView(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          buildMenuItems(context),
        ],
      ),
    ),
  );

  Widget buildMenuItems(BuildContext context) => Container(
    padding: const EdgeInsets.all(24),
    child: Wrap(
      runSpacing: 16,
      children: [
        ListTile(
          leading: const Icon(Icons.person),
          title: Text(AppLocalizations.of(context).person),
          onTap: (){},
        ),
      ],
    ),
  );
}

class MyPageState extends State<MyPage> {
  final _key = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: AppLocalizations.of(context).appname,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      themeMode: ThemeMode.system,
      home: Scaffold(
        key: _key,
        appBar: AppBar(
          title: Text(AppLocalizations.of(context).appname),
        ),
        drawer: SafeArea(
          bottom: false,
          child: const NavigationDrawer(),
        ),
        body: Stack(
        ),),
    );
  }
}

AppLocalizations.of(context).appname运行良好。但是AppLocalizations.of(context).person不起作用。所以我猜NavigationDrawer中的上下文没有locale信息。

46scxncf

46scxncf1#

这是因为.appname获取了main方法中定义的MaterialApp的上下文,但NavigationDrawer试图在MyPageState中定义的MaterialApp中查找本地化字符串。
Q.发生了什么?
A. MaterialApp有构建方法,它基于WidgetsApp,后者也有构建方法。在WidgetsApp的构建方法中,使用了Localizations小部件。AppLocalization.of(context)尝试在最近的Localizations小部件中查找AppLocalizations类对象,在您的情况下,该小部件是默认小部件。因此,它是抛出错误。
您可以在内部MaterialApp中再次传递本地化委托,或者您可以创建扩展方法来查找根目录下的AppLocalizations。

8fq7wneg

8fq7wneg2#

class MyPageState extends State<MyPage> {
  final _key = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: AppLocalizations.of(context).appname,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      themeMode: ThemeMode.system,
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en'),
        Locale('ja'),
      ],
      home: Scaffold(
        key: _key,
        appBar: AppBar(
          title: Text(AppLocalizations.of(context).appname),
        ),
        drawer: SafeArea(
          bottom: false,
          child: const NavigationDrawer(),
        ),
        body: Stack(
        ),),
    );
  }
}

相关问题