Performance 容器中的颤振ListView延迟渲染和性能
我有一长串经常更新的项目。使用包装在容器中的ListView.builder呈现列表,以应用边框等 我的问题是,当ListView位于容器中时,所有项目都会呈现,包括屏幕外的元素。由于列表经常被重新绘制,因此会严重影响性能 我创建了两个示例来说明这个问题。为了简单起见,示例是无状态的,在现实生活中列表是有状态的 示例1-ListView是根小部件。请注意,在控制台中,只生成可见的卡。 示例2-ListView包装在容器中。请注意,所有卡都已生成。 如何制作一个包含项目列表的可滚动容器,该列表只呈现可见的项目? 示例2的来源如下:Performance 容器中的颤振ListView延迟渲染和性能,performance,flutter,listview,lazy-evaluation,Performance,Flutter,Listview,Lazy Evaluation,我有一长串经常更新的项目。使用包装在容器中的ListView.builder呈现列表,以应用边框等 我的问题是,当ListView位于容器中时,所有项目都会呈现,包括屏幕外的元素。由于列表经常被重新绘制,因此会严重影响性能 我创建了两个示例来说明这个问题。为了简单起见,示例是无状态的,在现实生活中列表是有状态的 示例1-ListView是根小部件。请注意,在控制台中,只生成可见的卡。 示例2-ListView包装在容器中。请注意,所有卡都已生成。 如何制作一个包含项目列表的可滚动容器,该列表
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SingleChildScrollView(
child: Container(
color: Colors.green,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 700,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.44),
spreadRadius: 0,
blurRadius: 15,
offset:
Offset(0, 1), // changes position of shadow
),
]),
margin: EdgeInsets.all(24.0),
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: 20,
itemBuilder: (context, index) {
var text = 'Card $index';
print('Building card $text');
return Card(
child: Container(
height: 130,
child: Center(
child: Text(text),
)));
})
]))),
],
))));
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
MyApp({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:SingleChildScrollView(
子:容器(
颜色:颜色。绿色,
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
宽度:700,
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
boxShadow:[
箱形阴影(
颜色:颜色。黑色。不透明度(0.44),
半径:0,
半径:15,
抵消:
偏移量(0,1),//更改阴影的位置
),
]),
边距:所有边缘集(24.0),
子:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
物品计数:20,
itemBuilder:(上下文,索引){
var text='卡片$index';
打印(“建筑卡$text”);
回程卡(
子:容器(
身高:130,
儿童:中心(
子:文本(Text),
)));
})
]))),
],
))));
}
}
您应该为包装在容器中的listView设置高度限制。
就这样,
class MyApp extends StatelessWidget {
MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: SingleChildScrollView(
child: Container(
color: Colors.green,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 700,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.44),
spreadRadius: 0,
blurRadius: 15,
offset:
Offset(0, 1),
),
]),
margin: EdgeInsets.all(24.0),
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SizedBox( // add a SizedBox and set a specific height
height: 1000,
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: 20,
itemBuilder: (context, index) {
var text = 'Card $index';
print('testtest Building card $text');
return Card(
child: Container(
height: 130,
child: Center(
child: Text(text),
)));
}),
)
]))),
],
))));
}
}
类MyApp扩展了无状态小部件{
MyApp({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:SingleChildScrollView(
子:容器(
颜色:颜色。绿色,
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
宽度:700,
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(10),
boxShadow:[
箱形阴影(
颜色:颜色。黑色。不透明度(0.44),
半径:0,
半径:15,
抵消:
偏移量(0,1),
),
]),
边距:所有边缘集(24.0),
子:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
SizedBox(//添加一个SizedBox并设置一个特定的高度
身高:1000,
子项:ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
物品计数:20,
itemBuilder:(上下文,索引){
var text='卡片$index';
打印(“测试建筑卡$text”);
回程卡(
子:容器(
身高:130,
儿童:中心(
子:文本(Text),
)));
}),
)
]))),
],
))));
}
}
是。它起作用了。我通常不会设置固定的大小,因为我担心这会在各种平台上产生问题。但我想这就是出路。