1. A RenderViewport expected a child of type RenderSliver but received a child of type RenderConstrainedBox.
大致意思是 一个RenderViewport
的child
应该全部是RenderSliver
类型,但是它接收到的却有RenderConstrainedBox
类型的孩子。
注意child
是children
的单数,定位问题要考虑全面.
出现问题的代码块如下:
child: CustomScrollView(
slivers: [
SliverAppBar(
pinned: true,
expandedHeight: 250.0,
flexibleSpace: FlexibleSpaceBar(
title: Text("CustomScrollView Demo"),
background: Image.asset(
"images/header_bg.png",
fit: BoxFit.cover
),
),
),
SizedBox(
height: 100,
child: Container(
color: Colors.deepOrangeAccent,
child: PageView(
// scrollDirection: Axis.vertical,
children: [Text("新闻"),Text("历史")],
),
),
),
SliverPadding(
padding: EdgeInsets.all(8.0),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, //Grid按两列显示
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.cyan[100 * (index % 9)],
child: Text("gird item $index"),
);
},
childCount: 20
),
),
),
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.lightBlue[100 * (index % 9)],
child: Text("list Item $index"),
);
},
childCount: 20
),
)
],
),
CustomScrollView
的slivers
参数接受的是一个Sliver
数组,里面必须都是Sliver
类型的组件,但第二个SizedBox
是RenderBox
类型的组件,问题就在这。
要解决这个问题,要么去掉SizedBox
这个child
,要么给SizedBox
找个适配器,使之成为Sliver
类型
Flutter
中可滚动组件都有相应的Sliver
,常用的Sliver
如下:
这不就找到解决方案了~,给SizedBox
的外层套上一个SliverToBoxAdapter
. 修改后的代码如下:
Widget build(BuildContext context) {
return Material(
child: CustomScrollView(
slivers: [
SliverAppBar(
pinned: true,
expandedHeight: 250.0,
flexibleSpace: FlexibleSpaceBar(
title: Text("CustomScrollView Demo"),
background: Image.asset(
"images/header_bg.png",
fit: BoxFit.cover
),
),
),
SliverToBoxAdapter(
child:SizedBox(
height: 100,
child: Container(
color: Colors.deepOrangeAccent,
child: PageView(
// scrollDirection: Axis.vertical,
children: [Text("新闻"),Text("历史")],
),
),
),
),
SliverPadding(
padding: EdgeInsets.all(8.0),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, //Grid按两列显示
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.cyan[100 * (index % 9)],
child: Text("gird item $index"),
);
},
childCount: 20
),
),
),
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.lightBlue[100 * (index % 9)],
child: Text("list Item $index"),
);
},
childCount: 20
),
)
],
),
);
}
实现的效果如下:
参考文档链接:book.flutterchina.club/chapter6/cu…
2. The following assertion was thrown during performLayout():'package:flutter/src/rendering/stack.dart': Failed assertion: line 570 pos 12: 'size.isFinite': is not true
报错地方是:在Stack
组件的外层又嵌套了一个Column
组件,即Column
的children
里有Stack
,可能
会报以上错误,代码如下:
child: Column(
children: [
Stack(
children: [
Positioned(
left: 18.0,
child: Text("I am Jack"),
),
Positioned(
top: 18.0,
child: Text("Your friend"),
)
],
)
],
),
解决办法有两种,1), 去掉Column
组件 2), 在Stack
的children
里,添加一个Container
组件. 修改后代码如下:
//方式一
child: Stack(
children: [
Positioned(
left: 18.0,
child: Text("I am Jack"),
),
Positioned(
top: 18.0,
child: Text("Your friend"),
)
],
),
//方式二
child: Column(
children: [
Stack(
children: [
Container(
width: 300,height: 500,
color: Colors.red,
),
Positioned(
left: 18.0,
child: Text("I am Jack"),
),
Positioned(
top: 18.0,
child: Text("Your friend"),
)
],
)
],
),
Column,Row
等属于线性布局,Stack
属于层叠布局,两者结合使用时要注意尺寸大小是否定义完全,避免报错