如何更新颤振列表中的单个项目?
我需要最好的方法。
为什么我说最好的方式?
我需要更新单个项目并且不希望在更新单个项目时列表中存在的所有项目都被呈现。
我的意思是当更新单个项目时,应该只刷新该单个项目而不是整个列表。
因为如果整个列表只更新一个项目而被渲染,那么我们的应用程序可能不会有良好的性能。
那么有没有办法克服这个问题呢?
小智 28
这是我的方式
foods[foods.indexWhere((element) => element.uid == food.uid)] = food;
Run Code Online (Sandbox Code Playgroud)
应该应用一些验证以避免任何空引用问题
您可以通过在每个项目构建器中嵌套一个流构建器来实现此目的。这是通过使用initialData流构建器的参数来实现的。
final Stream<Item> updateItemsSteram = ...;
final List<Item> initialList = [...];
ListView.builder(
itemBuilder: (context, idx) {
return StreamBuilder<Item>(
initialData: initialList[idx],
stream: updateItemsSteram.where((item) => item.id == initialList[idx].id),
builder: (ctx, snapshot) => MyCustomWidget(snapshot.data)
);
}
)
Run Code Online (Sandbox Code Playgroud)
不过,您可能想要对此进行基准测试并将其与更新整个列表进行比较,因为 flutter 在所有情况下都会重用元素,并且流可能只会带来更多开销。
如果您有大量项目,则将 setState() 与 ListView.builder() 结合使用会很快。例如:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<int> ids = [];
initState() {
super.initState();
for (var i = 0; i < 100; i++) {
ids.add(i);
}
new Future.delayed(Duration(seconds: 3)).then((_) {
setState(() {
ids[4] = 1000;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: ListView.builder(
itemCount: ids.length,
itemBuilder: (context, idx) {
return ListTile(title: Text('${ids[idx]}'));
},
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
查看ListView.builder 文档以获取更多详细信息。
| 归档时间: |
|
| 查看次数: |
29346 次 |
| 最近记录: |