如何在Flutter中测试本地化小部件?

22

我按照Flutter文档的建议为我的Flutter应用程序添加了本地化功能,建议使用以下静态方法获取本地化:

static DemoLocalizations of(BuildContext context) {
  return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
}

当应用程序运行时,它能正常工作,但是在测试小部件时,返回的值总是null。

有没有简单的方法在测试中提供本地化?

目前我通过DI传递本地化,但这是相当繁琐的。

6个回答

30
您可以将想要测试的小部件包装在Localizations中。
Localizations(
  delegates: [
    yourDelegate
  ],
  locale: Locale('en'),
  child: YourWidget(),
);

12
这对我很有用。等待委托对象的 Future 完成非常重要。我使用 await tester.pumpAndSettle(); 来实现这一点。 - svi3c
1
如果您正在使用“gen_l10n app_localizations”,请查看此处以获取易于使用的实用程序函数:https://dev59.com/0lQK5IYBdhLWcg3wGMIP#73248298 - Felix Mittermeier

5
上述答案没有帮到我,因为我正在从json文件中获取字符串。这篇博客实际上解决了我的问题。

3
我编写了一个通用的实用函数,以使小部件测试中本地化的使用更加容易:
// Don't forget the import
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

...

Future<AppLocalizations> getLocalizations(WidgetTester t) async {
  late AppLocalizations result;
  await t.pumpWidget(
    MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      home: Material(
        child: Builder(
          builder: (BuildContext context) {
            result = AppLocalizations.of(context)!;
            return Container();
          },
        ),
      ),
    ),
  );
  return result;
}

为了在一行中获取本地化的文本,您只需要调用:
 await getLocalizations(t).then((l) => l.YOUR_KEY_HERE)

那么,也许对某些人有用 :)


对我来说不起作用 :( 在运行测试时抛出了以下LateError: LateInitializationError: 本地变量result尚未初始化 - undefined

2

另一种方法是使用Linux命令将整个文件分割成一些较小的文件,这种方法很有效。 - Quyen Anh Nguyen

1
如果您想测试特定语言中的现有小部件,可以通过以下方式获取本地化内容:
import 'package:flutter_localizations/flutter_localizations.dart';
...
(await GlobalMaterialLocalizations.delegate.load(Locale('en'))).okButtonLabel

或者

import 'package:flutter_gen/gen_l10n/app_localizations.dart';
...
(await GlobalMaterialLocalizations.delegate.load(Locale('en'))).myCustomLabel

0

这是可修改的如何在Flutter中测试本地化小部件?

在返回后,您需要添加await t.pumpAndSettle();

完整代码:

  Future<AppLocalizations> getLocalizationsUnderTests(
    WidgetTester t,
  ) async {
    late AppLocalizations result;
    await t.pumpWidget(
      MaterialApp(
        localizationsDelegates: const <LocalizationsDelegate>[
          GlobalCupertinoLocalizations.delegate,
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          AppLocalizations.delegate,
        ],
        supportedLocales: AppLocalizations.supportedLocales,
        locale: const Locale('en'),
        home: Material(
          child: Builder(
            builder: (BuildContext context) {
              result = AppLocalizations.of(context);
              debugPrint('[DEBUG]: locale: $result');

              // The builder function must return a widget.
              return const Placeholder();
            },
          ),
        ),
      ),
    );
    await t.pumpAndSettle();
    return result;
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接