[go: nahoru, domu]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception thrown on widget testing #59938

Closed
geovin89 opened this issue Jun 21, 2020 · 5 comments
Closed

Exception thrown on widget testing #59938

geovin89 opened this issue Jun 21, 2020 · 5 comments

Comments

@geovin89
Copy link
geovin89 commented Jun 21, 2020

Scenario:
I am trying to unit test one of my widgets for my SignInForm screen. Code is exactly like the LoginForm code provided in the bloc firebase login tutorial

testWidgets(
        'should have 2 email/password text fields',
        (WidgetTester tester) async {
      await tester.pumpWidget(
        BlocProvider.value(
          value: signInBloc,
          child: SignInForm(),
        ),
      );

      final emailTextField = find.widgetWithText(TextFormField, 'Email');
      final passwordTextField = find.widgetWithText(TextFormField, 'Password');

      expect(emailTextField, findsOneWidget);
      expect(passwordTextField, findsOneWidget);
    });

but it throws the following exception:

The following assertion was thrown building Listener:
'package:flutter/src/painting/basic_types.dart': Failed assertion: line 223 pos 10: 'textDirection
!= null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

The relevant error-causing widget was:
  ListView
  file:///**/**/presentation/widgets/sign_in_form.dart:68:22

When the exception was thrown, this was the stack:
#2      textDirectionToAxisDirection (package:flutter/src/painting/basic_types.dart:223:10)
#3      Viewport.getDefaultCrossAxisDirection (package:flutter/src/widgets/viewport.dart:134:16)
#4      Viewport.createRenderObject (package:flutter/src/widgets/viewport.dart:145:58)
#5      RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5366:28)
#6      MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5943:11)
#7      _ViewportElement.mount (package:flutter/src/widgets/viewport.dart:196:11)
...     Normal element mounting (123 frames)
#130    SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
...     Normal element mounting (9 frames)
#139    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
#140    Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
#141    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16)
#142    _InheritedProviderScopeElement.performRebuild (package:provider/src/inherited_provider.dart:387:11)
#143    Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
#144    ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
#145    ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
...     Normal element mounting (7 frames)
#152    SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
...     Normal element mounting (7 frames)
#159    SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
#160    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
#161    Element.updateChild (package:flutter/src/widgets/framework.dart:3211:20)
#162    RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1148:16)
#163    RenderObjectToWidgetElement.update (package:flutter/src/widgets/binding.dart:1126:5)
#164    RenderObjectToWidgetElement.performRebuild (package:flutter/src/widgets/binding.dart:1140:7)
#165    Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
#166    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2627:33)
#167    AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1006:18)
#168    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:284:5)
#169    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1113:15)
#170    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1052:9)
#171    AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:879:9)
#174    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#175    AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:866:27)
#176    WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:441:22)
#179    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#180    WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:438:27)
#181    main.<anonymous closure>.<anonymous closure> (file:///Users/GeoVin/workspace/the_dollop_app_project/the_dollop_app/test/features/login/presentation/widgets/sing_in_form_test.dart:23:20)
#182    testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:140:29)
<asynchronous suspension>
#183    testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart)
#184    TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:703:19)
<asynchronous suspension>
#187    TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:683:14)
#188    AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1083:24)
#194    AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1080:15)
#195    testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:133:24)
#196    Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:172:27)
<asynchronous suspension>
#197    Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart)
#198    Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:246:15)
#203    Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:243:5)
#204    Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:170:33)
#209    Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:13)
#210    Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:400:30)
(elided 37 frames from class _AssertionError, class _FakeAsync, class _RawReceivePortImpl, class _Timer, dart:async, dart:async-patch, and package:stack_trace)

════════════════════════════════════════════════════════════════════════════════════════
@geovin89
Copy link
Author
geovin89 commented Jun 21, 2020

Update:
If I wrap it with a MaterialAppWidget like this

await tester.pumpWidget(
        MaterialApp(
          home: BlocProvider.value(
            value: signInBloc,
            child: SignInForm(),
          ),
        ),
      );

I get a new error: (I think the issue is related to having a TextFormField inside a Listview for my SignInForm widget)

╞═══════════════════════════════════════════════════════════
The following assertion was thrown building TextField(controller:
TextEditingController#93d22(TextEditingValue(text: ┤├, selection: TextSelection(baseOffset: -1,
extentOffset: -1, affinity: TextAffinity.downstream, isDirectional: false), composing:
TextRange(start: -1, end: -1))), enabled: true, decoration: InputDecoration(icon:
Icon(IconData(U+0E0BE)), labelText: "Email", floatingLabelBehavior: FloatingLabelBehavior.auto,
alignLabelWithHint: false), keyboardType: TextInputType(name: TextInputType.emailAddress, signed:
null, decimal: null), autocorrect: false, dirty, state: _TextFieldState#def8e):
No Material widget found.
TextField widgets require a Material widget ancestor.
In material design, most widgets are conceptually "printed" on a sheet of material. In Flutter's
material library, that material is represented by the Material widget. It is the Material widget
that renders ink splashes, for instance. Because of this, many material library widgets require that
there be a Material widget in the tree above them.
To introduce a Material widget, you can either directly include one, or use a widget that contains
Material itself, such as a Card, Dialog, Drawer, or Scaffold.
The specific widget that could not find a Material ancestor was:
  TextField
The ancestors of this widget were:
  ...
  TextFormField
  RepaintBoundary
  IndexedSemantics
  NotificationListener<KeepAliveNotification>
  KeepAlive
  ...

The relevant error-causing widget was:
  TextFormField
  file:///Users/GeoVin/workspace/the_dollop_app_project/the_dollop_app/lib/features/login/presentation/widgets/sign_in_form.dart:78:19

When the exception was thrown, this was the stack:
#0      debugCheckHasMaterial.<anonymous closure> (package:flutter/src/material/debug.dart:28:7)
#1      debugCheckHasMaterial (package:flutter/src/material/debug.dart:50:4)
#2      _TextFieldState.build (package:flutter/src/material/text_field.dart:951:12)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15)
#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
#7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
#8      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4666:11)
#9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
...     Normal element mounting (41 frames)
#50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
#51     Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
#52     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1162:36)
#53     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1147:20)
#54     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2607:19)
#55     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1140:11)
#56     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:354:23)
#57     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1866:58)
#58     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15)
#59     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1866:13)
#60     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:343:5)
#61     RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:5)
#62     RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:219:19)
#63     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:262:19)
#64     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#65     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:135:11)
#66     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:375:11)
#67     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#68     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:452:13)
#69     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1444:12)
#70     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1353:20)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#72     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#74     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#75     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#85     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#86     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#87     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#88     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#89     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#90     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:207:11)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#92     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#93     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#94     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#98     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#99     RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#100    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#101    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#102    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#103    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#104    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#105    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#106    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#107    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3225:13)
#108    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#109    _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:700:15)
#110    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#111    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#112    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#113    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#114    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#115    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#116    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#117    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#118    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#119    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#120    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#121    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:13)
#122    RenderObject.layout (package:flutter/src/rendering/object.dart:1767:7)
#123    RenderView.performLayout (package:flutter/src/rendering/view.dart:167:13)
#124    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1630:7)
#125    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#126    AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1009:23)
#127    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:284:5)
#128    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1113:15)
#129    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1052:9)
#130    AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:879:9)
#133    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#134    AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:866:27)
#135    WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:441:22)
#138    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#139    WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:438:27)
#140    main.<anonymous closure>.<anonymous closure> (file:///Users/GeoVin/workspace/the_dollop_app_project/the_dollop_app/test/features/login/presentation/widgets/sing_in_form_test.dart:24:20)
#141    main.<anonymous closure>.<anonymous closure> (file:///Users/GeoVin/workspace/the_dollop_app_project/the_dollop_app/test/features/login/presentation/widgets/sing_in_form_test.dart:23:9)
#142    testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:140:29)
#155    AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1099:17)
#156    AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1087:35)
(elided 31 frames from class _FakeAsync, dart:async, and package:stack_trace)

════════════════════════════════════════════════════════════════════════════════════════════════════

@VladyslavBondarenko
Copy link

Hi @geovin89
does it help if you wrap BlocProvider.value in Scaffold?

@VladyslavBondarenko VladyslavBondarenko added in triage Presently being triaged by the triage team waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds labels Jun 22, 2020
@geovin89
Copy link
Author

Yes. Having it in both Material App and Scaffold widget seems to fix the issue. I guess it just lacks better logs to resolve the issue.
"or we should provide substantially
more information in this error message to help you determine and fix the underlying cause." :)

@no-response no-response bot removed the waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds label Jun 22, 2020
@VladyslavBondarenko
Copy link

@geovin89
the log says

To introduce a Material widget, you can either directly include one, or use a widget that contains
Material itself, such as a Card, Dialog, Drawer, or Scaffold.

closing as solved

@VladyslavBondarenko VladyslavBondarenko removed the in triage Presently being triaged by the triage team label Jun 25, 2020
@github-actions
Copy link

This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Aug 19, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants