Flutter如何测试本地化Widget?解决测试时AppLocalizations为null的问题
问题原因
测试时直接渲染SampleItemDetailsView未在上层注入本地化配置,导致AppLocalizations.of(context)返回空值触发空安全报错。
解决步骤
- 第一步:在测试文件顶部补全必要导入,除了原本的Widget导入和测试包导入外,需要引入项目本地化配置、全局本地化委托包:
import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:skeleton/l10n/app_localizations.dart'; import 'package:skeleton/src/sample_feature/sample_item_details_view.dart';
- 第二步:修改测试用例,给目标Widget外层包裹配置好本地化参数的
MaterialApp,注入对应的本地化委托和支持语言列表:
void main() { group('Sample item details', () { testWidgets('should display appbar', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: AppLocalizations.supportedLocales, home: const SampleItemDetailsView(), ), ); // 可补充验证逻辑,比如验证页面文本是否正确渲染 expect(find.text('Item Details'), findsOneWidget); }); }); }
- 第三步(可选):如果需要测试多语言适配效果,可在
MaterialApp中指定locale参数切换测试用的语言,例如指定中文环境测试:
MaterialApp( locale: const Locale('zh', 'CN'), // 其余配置和第二步一致 )
注意事项
- 如果你的项目有自定义的主题、路由配置,也可以同步写到测试用的
MaterialApp里,保证测试环境和正式运行环境尽可能一致。 - 要是多个测试用例都需要用到本地化配置,可以把外层的
MaterialApp封装成公共工具方法,减少重复代码。
内容的提问来源于stack exchange,提问作者Federico Conte
相关产品推荐
相关产品推荐

