首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`easy_localization`永久挂起小部件测试

使用`easy_localization`永久挂起小部件测试
EN

Stack Overflow用户
提问于 2022-11-12 18:44:58
回答 1查看 22关注 0票数 0

内部使用tr扩展的小部件失败。考虑一下这个例子:

代码语言:javascript
复制
void main() {
  testWidgets('no decks', (WidgetTester tester) async {
    await tester.pumpWidget(const DeckList(decks: []));
    await tester.pumpAndSettle();

    // test code
  });
}

这里的...where DeckList小部件在ListView小部件中的某些Text小部件上使用tr。但这并没有说明:

代码语言:javascript
复制
The following assertion was thrown building ListView(scrollDirection: horizontal, dirty):
No Directionality widget found.
ListView widgets require a Directionality widget ancestor.
The specific widget that could not find a Directionality ancestor was:
  ListView
The ownership chain for the affected widget is: "ListView ← SizedBox ← DeckList ← [root]"
Typically, the Directionality widget is introduced by the MaterialApp or WidgetsApp widget at the
top of your application widget tree. It determines the ambient reading direction and is used, for
example, to determine how to lay out text, how to interpret "start" and "end" values, and to resolve
EdgeInsetsDirectional, AlignmentDirectional, and other *Directional objects.

我假设这些tr扩展使用BuildContext在小部件树中查找以检查Directionality小部件,我认为它负责定义文本是LTR还是RTL。我想这就是失败的原因。

所以,用EasyLocalization包起来应该可以修复它,对吗?

代码语言:javascript
复制
void main() {
  testWidgets('no decks', (WidgetTester tester) async {
    await tester.pumpWidget(
      EasyLocalization( // we wrap the widget
        supportedLocales: const [
          Locale('en', 'US'),
          Locale('tr', 'TR'),
        ],
        path: 'assets/translations',
        fallbackLocale: const Locale('en', 'US'),
        assetLoader: YamlAssetLoader(),
        child: const DeckList(decks: []),
      ),
    );
    await tester.pumpAndSettle();

    // test code
  });
}

当然,这也不能肯定地说:

代码语言:javascript
复制
The following LateError was thrown attaching to the render tree:
LateInitializationError: Field '_deviceLocale@1279168148' has not been initialized.

When the exception was thrown, this was the stack:
#0      EasyLocalizationController._deviceLocale (package:easy_localization/src/easy_localization_controller.dart)
#1      new EasyLocalizationController (package:easy_localization/src/easy_localization_controller.dart:54:9)
#2      _EasyLocalizationState.initState (package:easy_localization/src/easy_localization_app.dart:123:30)
#3      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5015:57)
#4      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853:5)
#5      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863:16)
#6      Element.updateChild (package:flutter/src/widgets/framework.dart:3586:20)
#7      RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1195:16)
#8      RenderObjectToWidgetElement.update (package:flutter/src/widgets/binding.dart:1172:5)
#9      RenderObjectToWidgetElement.performRebuild (package:flutter/src/widgets/binding.dart:1186:7)
#10     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
#11     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2667:19)
#12     AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1191:19)
#13     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:378:5)
#14     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1175:15)
#15     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1104:9)
#16     AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:1057:9)
#19     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
#20     AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1043:27)
#21     WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:554:22)
#24     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
#25     WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:551:27)
#26     main.<anonymous closure> (file:///home/erayerdin/Projects/lexendify/app/test/domains/decks/presentation/components/deck_list_component_test.dart:11:18)
#27     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:171:29)
<asynchronous suspension>
<asynchronous suspension>
(elided 5 frames from dart:async and package:stack_trace)

_deviceLocale是空的。因此,我们应该确保颤振小部件绑定和easy_localization加载。因此,小部件测试代码是:

代码语言:javascript
复制
void main() {
  testWidgets('no decks', (WidgetTester tester) async {
    // we wait for these to initialize
    WidgetsFlutterBinding.ensureInitialized();
    await EasyLocalization.ensureInitialized();
    await tester.pumpWidget(
      EasyLocalization(
        supportedLocales: const [
          Locale('en', 'US'),
          Locale('tr', 'TR'),
        ],
        path: 'assets/translations',
        fallbackLocale: const Locale('en', 'US'),
        assetLoader: YamlAssetLoader(),
        child: const DeckList(decks: []),
      ),
    );
    await tester.pumpAndSettle();

    // test code
  });
}

然而,这一次,整个小部件测试以较低的CPU使用率挂起并永久运行。我认为这是因为EasyLocalization.ensureInitialized在Android环境下做得很好,而不是小部件测试环境。

我很确定EasyLocalization.ensureInitialized永远在等待,因为当我删除WidgetsFlutterBinding.ensureInitialized();时,它仍然在等待。

那么,是什么导致了这场绞刑?如何进一步调试?

提前谢谢。

环境

代码语言:javascript
复制
[✓] Flutter (Channel stable, 3.3.5, on Fedora Linux 36 (KDE Plasma) 6.0.7-200.fc36.x86_64, locale en_US.UTF-8)
    • Flutter version 3.3.5 on channel stable at /home/erayerdin/snap/flutter/common/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision d9111f6402 (3 weeks ago), 2022-10-19 12:27:13 -0700
    • Engine revision 3ad69d7be3
    • Dart version 2.18.2
    • DevTools version 2.15.0

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /home/erayerdin/.sdks/android/
    • Platform android-33, build-tools 33.0.0
    • Java binary at: /var/lib/snapd/snap/android-studio/125/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • clang version 10.0.0-4ubuntu1
    • cmake version 3.16.3
    • ninja version 1.10.0
    • pkg-config version 0.29.1

[✓] Android Studio (version 2021.3)
    • Android Studio at /var/lib/snapd/snap/android-studio/125/android-studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)

[✓] VS Code
    • VS Code at /snap/code/current
    • Flutter extension version 3.52.0

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Fedora Linux 36 (KDE Plasma) 6.0.7-200.fc36.x86_64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 107.0.5304.110

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

相关的依赖关系是:

代码语言:javascript
复制
easy_localization: ^3.0.1
easy_localization_loader: ^1.0.1+1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-12 19:47:56

因此,用MaterialApp包装小部件解决了我的问题,这表明这与easy_translation无关。这是我的解决方案:

代码语言:javascript
复制
await tester.pumpWidget(
  const MaterialApp(
    home: DeckList(decks: []),
  ),
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74415626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档