我想用导航抽屉制作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信息。
2条答案
按热度按时间46scxncf1#
这是因为
.appname
获取了main方法中定义的MaterialApp的上下文,但NavigationDrawer试图在MyPageState中定义的MaterialApp中查找本地化字符串。Q.发生了什么?
A. MaterialApp有构建方法,它基于WidgetsApp,后者也有构建方法。在WidgetsApp的构建方法中,使用了Localizations小部件。AppLocalization.of(context)尝试在最近的Localizations小部件中查找AppLocalizations类对象,在您的情况下,该小部件是默认小部件。因此,它是抛出错误。
您可以在内部MaterialApp中再次传递本地化委托,或者您可以创建扩展方法来查找根目录下的AppLocalizations。
8fq7wneg2#