我在嵌套列表视图之一中遇到了一个奇怪的错误。详情如下。
我有一个主视图屏幕,其实现如下所示:
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
好吧,问题是因为扩展的小部件造成的
AsyncLoading() =>
Expanded(child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: MediaQuery.of(context).size.width ~/ 240,
itemBuilder: (context, index) {
return BigPreviewCardLoading();
},
)),
请记住,您的整个设计都包含在
ListView.separated
中,您无法在列表视图中展开。
因此,删除展开的小部件。简而言之,希望对您有帮助。