Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 容器中的颤振ListView延迟渲染和性能_Performance_Flutter_Listview_Lazy Evaluation - Fatal编程技术网

Performance 容器中的颤振ListView延迟渲染和性能

Performance 容器中的颤振ListView延迟渲染和性能,performance,flutter,listview,lazy-evaluation,Performance,Flutter,Listview,Lazy Evaluation,我有一长串经常更新的项目。使用包装在容器中的ListView.builder呈现列表,以应用边框等 我的问题是,当ListView位于容器中时,所有项目都会呈现,包括屏幕外的元素。由于列表经常被重新绘制,因此会严重影响性能 我创建了两个示例来说明这个问题。为了简单起见,示例是无状态的,在现实生活中列表是有状态的 示例1-ListView是根小部件。请注意,在控制台中,只生成可见的卡。 示例2-ListView包装在容器中。请注意,所有卡都已生成。 如何制作一个包含项目列表的可滚动容器,该列表

我有一长串经常更新的项目。使用包装在容器中的ListView.builder呈现列表,以应用边框等

我的问题是,当ListView位于容器中时,所有项目都会呈现,包括屏幕外的元素。由于列表经常被重新绘制,因此会严重影响性能

我创建了两个示例来说明这个问题。为了简单起见,示例是无状态的,在现实生活中列表是有状态的

示例1-ListView是根小部件。请注意,在控制台中,只生成可见的卡。

示例2-ListView包装在容器中。请注意,所有卡都已生成。

如何制作一个包含项目列表的可滚动容器,该列表只呈现可见的项目?

示例2的来源如下:

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),
)));
}),
)
]))),
],
))));
}
}

是。它起作用了。我通常不会设置固定的大小,因为我担心这会在各种平台上产生问题。但我想这就是出路。