嵌套多个列表视图时出现异常,Flutter

问题描述 投票:0回答:1

我在嵌套列表视图之一中遇到了一个奇怪的错误。详情如下。

我有一个主视图屏幕,其实现如下所示:

class HomeView extends StatelessWidget {
  const HomeView({super.key});

  @override
  Widget build(BuildContext context) {
    final List<Widget> sections = [
      const Greeting(),
      const ExamSessionCountdown(),
      const NewsSection(),
      const BuildingsSection(),
      const StudyCirclesSection(),
      const DepartmentSection(),
    ];
    return Scaffold(
      backgroundColor: context.colorTheme.whiteSoap,
      appBar: LogoAppBar(context),
      body: ListView.separated(
        padding: const EdgeInsets.only(bottom: 48),
        itemBuilder: (context, index) => sections[index],
        separatorBuilder: (context, index) => const SizedBox(height: 16),
        itemCount: sections.length,
      ),
    );
  }
}

问题出在其中 1 个小部件 -

NewsSection

它的实现如下所示:

class NewsSection extends StatelessWidget {
  const NewsSection({super.key});

  @override
  Widget build(BuildContext context) =>
     Column(
            children: [
              SubsectionHeader(
                  title: context.localize!.whats_up, onClick: () => {}),
              const _NewsList()
            ],
     );
}

class _NewsList extends ConsumerWidget {
  const _NewsList();

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final state = ref.watch(infosPreviewRepositoryProvider);
    return switch (state) {
      AsyncLoading() =>
            Expanded(child: ListView.builder(
            scrollDirection: Axis.horizontal,
            itemCount: MediaQuery.of(context).size.width ~/ 240,
            itemBuilder: (context, index) {
              return  BigPreviewCardLoading();
            },
            )),
      AsyncError(:final error) =>
        MyErrorWidget(NewsSectionConfig.errorMsg + error.toString()),
      AsyncValue(:final value) => Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              padding: const EdgeInsets.only(left: 6, top: 16),
              child: SizedBox(
                  height: BigPreviewCardConfig.cardHeight,
                  child: ListView.builder(
                      cacheExtent: 4,
                      shrinkWrap: true,
                      scrollDirection: Axis.horizontal,
                      itemCount: value?.length ?? 0,
                      itemBuilder: (BuildContext context, int index) {
                        return [...]
                      })),
            )
          ],
        )
    };
  }
}

问题出在加载部分。加载数据时,编译器会发送错误(粘贴在下面)。但是,当加载完成并调用 AsyncValue 时,一切正常。

加载部分的列表视图中显示什么小部件并不重要;我尝试用普通的 SizedBox 替换它。

当从主视图的屏幕列表视图中取出并单独放置(仅在脚手架的主体插槽中)时,加载阶段的小部件可以正常工作。

错误:


======== Exception caught by rendering library =====================================================
The following assertion was thrown during performLayout():
RenderBox was not laid out: RenderRepaintBoundary#8ccaf relayoutBoundary=up4 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1972 pos 12: 'hasSize'


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=2_bug.yml

The relevant error-causing widget was: 
  ListView ListView:file:///C:/Users/mikic/AndroidStudioProjects/topwr-mobile/lib/features/home_view/home_view.dart:27:22
When the exception was thrown, this was the stack: 
#2      RenderBox.size (package:flutter/src/rendering/box.dart:1972:12)
#3      RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:65)
#4      RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#5      RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#6      RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:489:13)
#7      RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:239:19)
#8      RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:281:12)
#9      RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#10     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:139:12)
#11     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:361:11)
#12     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#13     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:601:13)
#14     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1554:12)
#15     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1463:20)
#16     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#17     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#18     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#19     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#20     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#21     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#22     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#23     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#24     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#25     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#26     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#27     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#28     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#29     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#30     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#31     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#32     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#33     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#34     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#35     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#36     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#37     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#38     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#39     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#40     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1434:11)
#41     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#42     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#43     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:173:12)
#44     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1062:7)
#45     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:237:7)
#46     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#47     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#48     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#49     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#50     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#51     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#52     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#53     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1434:11)
#54     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#55     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#56     RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:434:14)
#57     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#58     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#59     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:173:12)
#60     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1062:7)
#61     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:237:7)
#62     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:403:14)
#63     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#64     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#65     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#66     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#67     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#68     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#69     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1434:11)
#70     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#71     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#72     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#74     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#75     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#76     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#77     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#80     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#81     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#82     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#83     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#85     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#86     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#87     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#88     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#89     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#90     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#92     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#93     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#94     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#95     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#98     RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#99     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#100    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3714:13)
#101    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#102    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#105    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#106    _RenderTheaterMixin.performLayout (package:flutter/src/widgets/overlay.dart:884:15)
#107    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#108    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#109    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#110    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#111    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#112    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#113    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#114    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#115    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#116    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#117    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#118    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#119    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#120    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#121    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#122    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#123    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#124    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#125    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#126    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#127    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#128    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#129    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#130    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#131    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#132    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#133    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:21)
#134    RenderObject.layout (package:flutter/src/rendering/object.dart:2546:7)
#135    RenderBox.layout (package:flutter/src/rendering/box.dart:2389:11)
#136    RenderView.performLayout (package:flutter/src/rendering/view.dart:195:14)
#137    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2385:7)
#138    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1025:18)
#139    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1038:15)
#140    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:591:23)
#141    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:986:13)
#142    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:457:5)
#143    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1325:15)
#144    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1255:9)
#145    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1113:5)
#146    _invoke (dart:ui/hooks.dart:312:13)
#147    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:383:5)
#148    _drawFrame (dart:ui/hooks.dart:283:31)
(elided 2 frames from class _AssertionError)
The following RenderObject was being processed when the exception was fired: RenderIndexedSemantics#8a6cf relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...  parentData: index=4; layoutOffset=None (can use size)
...  constraints: BoxConstraints(w=411.4, 0.0<=h<=Infinity)
...  size: MISSING
...  index: 2
RenderObject: RenderIndexedSemantics#8a6cf relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
  parentData: index=4; layoutOffset=None (can use size)
  constraints: BoxConstraints(w=411.4, 0.0<=h<=Infinity)
  size: MISSING
  index: 2
...  child: RenderRepaintBoundary#8ccaf relayoutBoundary=up4 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...    needs compositing
...    parentData: <none> (can use size)
...    constraints: BoxConstraints(w=411.4, 0.0<=h<=Infinity)
...    size: MISSING
...    usefulness ratio: no metrics collected yet (never painted)
...    child: RenderFlex#5db9f relayoutBoundary=up5 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...      parentData: <none> (can use size)
...      constraints: BoxConstraints(w=411.4, 0.0<=h<=Infinity)
...      size: MISSING
...      direction: vertical
...      mainAxisAlignment: start
...      mainAxisSize: max
...      crossAxisAlignment: center
...      verticalDirection: down
...      child 1: RenderPadding#7a2c5 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: offset=Offset(0.0, 0.0); flex=null; fit=null
...        constraints: MISSING
...        size: MISSING
...        padding: EdgeInsets(24.0, 16.0, 24.0, 0.0)
...        textDirection: ltr
...        child: RenderConstrainedBox#41c3b NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: offset=Offset(0.0, 0.0)
...          constraints: MISSING
...          size: MISSING
...          additionalConstraints: BoxConstraints(w=Infinity, 0.0<=h<=Infinity)
...      child 2: RenderClipRect#85e55 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...        parentData: offset=Offset(0.0, 0.0); flex=1; fit=FlexFit.tight
...        constraints: MISSING
...        size: MISSING
...        child: RenderTransform#e8c89 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...          parentData: <none>
...          constraints: MISSING
...          size: MISSING
...          transform matrix: [0] 1.0,0.0,0.0,0.0
[1] 0.0,1.0,0.0,0.0
[2] 0.0,0.0,1.0,0.0
[3] 0.0,0.0,0.0,1.0
...          origin: null
...          alignment: Alignment.centerRight
...          textDirection: ltr
...          transformHitTests: true

flutter mobile
1个回答
0
投票

好吧,问题是因为扩展的小部件造成的

  AsyncLoading() =>
            Expanded(child: ListView.builder(
            scrollDirection: Axis.horizontal,
            itemCount: MediaQuery.of(context).size.width ~/ 240,
            itemBuilder: (context, index) {
              return  BigPreviewCardLoading();
            },
            )),

请记住,您的整个设计都包含在

ListView.separated
中,您无法在列表视图中展开。

因此,删除展开的小部件。简而言之,希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.