Первый элемент сломан, когда я прокручиваю назад

Пытаюсь сделать хакерскую читалку новостей. Я получаю сообщение об ошибке, но я не совсем уверен, что происходит. Когда я пытаюсь выполнить следующий шаг, первый элемент исчезает, и я получаю журнал ошибок, сообщающий мне, что '_debugSubtreeRelayoutRootAlreadyMarkedNeedsLayout()': не соответствует действительности.

  1. Прокрутите список вверх.

  2. Прокрутите список вниз до самого верха.

Это выглядит так

Первый элемент сломан, когда я прокручиваю назад

И я также загружаю демо, если это полезно. https://github.com/keeweeChang/flutter_news/tree/list_error

И вот git, чтобы показать ситуацию с ошибкой. https://media.giphy.com/media/XKGJrdAvgLcy9zyJwM/giphy.gif

Error log: I/flutter (30902): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════

I/flutter (30902): The following assertion was thrown building FutureBuilder(state:

I/flutter (30902): _FutureBuilderState#fd3d0):

I/flutter (30902): 'package:flutter/src/rendering/object.dart': Failed assertion: line 1409 pos 14:

I/flutter (30902): '_debugSubtreeRelayoutRootAlreadyMarkedNeedsLayout()': is not true.

I/flutter (30902):

I/zygote (30902): Do partial code cache collection, code=59KB, data=43KB

I/flutter (30902): Either the assertion indicates an error in the framework itself, or we should provide substantially

I/flutter (30902): more information in this error message to help you determine and fix the underlying cause.

I/flutter (30902): In either case, please report this assertion by filing a bug on GitHub:

I/flutter (30902): https://github.com/flutter/flutter/issues/new?template=BUG.md

I/flutter (30902):

I/flutter (30902): When the exception was thrown, this was the stack:

I/flutter (30902): #2 RenderObject.markNeedsLayout (package:flutter/src/rendering/object.dart:1409:14)

I/flutter (30902): #3 RenderBox.markNeedsLayout (package:flutter/src/rendering/box.dart:1842:11)

I/flutter (30902): #4 RenderObject.dropChild (package:flutter/src/rendering/object.dart:1158:5)

I/flutter (30902): #5 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin.child= (package:flutter/src/rendering/object.dart:2744:7)

I/flutter (30902): #6 SingleChildRenderObjectElement.removeChildRenderObject (package:flutter/src/widgets/framework.dart:4909:18)

I/flutter (30902): #7 RenderObjectElement.detachRenderObject (package:flutter/src/widgets/framework.dart:4749:36)

I/flutter (30902): #8 Element.detachRenderObject. (package:flutter/src/widgets/framework.dart:2866:13)

I/flutter (30902): #9 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3775:14)

I/flutter (30902): #10 Element.detachRenderObject (package:flutter/src/widgets/framework.dart:2865:5)

I/flutter (30902): #11 Element.deactivateChild (package:flutter/src/widgets/framework.dart:2995:11)

I/flutter (30902): #12 Element.updateChild (package:flutter/src/widgets/framework.dart:2760:7)

I/flutter (30902): #13 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3752:16)

I/flutter (30902): #14 Element.rebuild (package:flutter/src/widgets/framework.dart:3564:5)

I/flutter (30902): #15 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2277:33)

I/zygote (30902): After code cache collection, code=59KB, data=43KB

I/zygote (30902): Increasing code cache capacity to 256KB

I/flutter (30902): #16 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)

I/flutter (30902): #17 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:275:5)

I/flutter (30902): #18 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)

I/flutter (30902): #19 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)

I/flutter (30902): #20 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)

I/flutter (30902): #24 _invoke (dart:ui/hooks.dart:209:10)

I/flutter (30902): #25 _drawFrame (dart:ui/hooks.dart:168:3)

I/flutter (30902): (elided 5 frames from class _AssertionError and package dart:async)

I/flutter (30902): ═══════════════════════════════════

I/flutter (30902): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1153 pos 12: 'child.parentData != null': is not true.

I/flutter (30902): Another exception was thrown: NoSuchMethodError: The getter 'debugDoingLayout' was called on null.

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: _RenderListTile#46ebb relayoutBoundary=up5 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: RenderPadding#0a187 relayoutBoundary=up4 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: RenderSemanticsAnnotations#d9f7e relayoutBoundary=up3 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: RenderPointerListener#e0701 relayoutBoundary=up2 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#57551 relayoutBoundary=up1 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: RenderBox was not laid out: RenderFlex#915e5 NEEDS-PAINT DETACHED

I/flutter (30902): Another exception was thrown: NoSuchMethodError: The method '<=' was called on null.

Flutter doctor • Flutter version 1.3.8 at /Users/louis/flutter/flutterSDK

• Framework revision e5b1ed7a7f (13 days ago), 2019-03-06 14:23:37 -0800

• Engine revision f4951df193

• Dart version 2.2.1 (build 2.2.1-dev.0.0 571ea80e11)

Обновлять

Согласно моему тесту, ошибка устраняется, когда я использую контейнер фиксированной высоты для упаковки элемента. Но я хочу спросить, элемент ListView не поддерживает виджет динамической высоты или какие-либо параметры, которые я должен установить. Или это проблема в режиме отладки? Вот структура виджета с решенной проблемой: Структура виджета

Вопрос можно решить так:

  @override
  Widget build(BuildContext context) {
    final bloc = StoriesProvider.of(context);
    return StreamBuilder(
      stream: bloc.items,
      builder: (context, AsyncSnapshot<Map<int, Future<ItemModel>>> snapshot) {
        return Container(
          height: 80,
          child: buildItem(snapshot),
        );
      },
    );
  }

  Widget buildItem(AsyncSnapshot<Map<int, Future<ItemModel>>> snapshot) {
    if (!snapshot.hasData) {
     ...(Create loading widget)
    }
    else {
     ...(Create ListTile widget by FutureBuilder)
    }
  }

Я не могу воссоздать это из кода, который у вас есть на GitHub. Это происходит каждый раз для вас?

Tom Alabaster 20.03.2019 16:55

Да, это часто происходит, если я создаю отладочную версию. Я также делаю гифку, чтобы показать ошибку: media.giphy.com/media/XKGJrdAvgLcy9zyJwM/giphy.gif

Kuo-Hao Chang 21.03.2019 04:09
0
2
676
0

Другие вопросы по теме