如何更新颤振列表中的单个项目,作为最好的方法

21 dart flutter

如何更新颤振列表中的单个项目?

我需要最好的方法。

为什么我说最好的方式?

我需要更新单个项目并且不希望在更新单个项目时列表中存在的所有项目都被呈现。

我的意思是当更新单个项目时,应该只刷新该单个项目而不是整个列表。

因为如果整个列表只更新一个项目而被渲染,那么我们的应用程序可能不会有良好的性能。

那么有没有办法克服这个问题呢?

小智 28

这是我的方式

foods[foods.indexWhere((element) => element.uid == food.uid)] = food;
Run Code Online (Sandbox Code Playgroud)

应该应用一些验证以避免任何空引用问题

  • lan Smith - `foods` 是一个包含许多 `map` 类型元素的 `List`。`food` 是具有更新值的元素。`foods.indexWhere((element) => element.uid == food.uid)` 用于获取元素的索引,如果 `element.uid == food.uid` 条件匹配,则它将返回一个 `index`像 0 或 1 这样的值或其他整数类型,它是“foods”列表中更新元素的位置。最后,“食物”列表将根据找到的索引进行更新,例如。`食物[1] =食物`。就是这样。感谢您给我机会详细阐述这个答案:) (2认同)

mot*_*tia 5

您可以通过在每个项目构建器中嵌套一个流构建器来实现此目的。这是通过使用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 在所有情况下都会重用元素,并且流可能只会带来更多开销。


Joh*_*yan 3

如果您有大量项目,则将 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 文档以获取更多详细信息。

  • 您好,谢谢您的回答,但这段代码仍然令人困惑,我的问题是如何从大列表中更新单个项目。就像whatsapp一样,屏幕上显示很多消息,当我们发送消息并且其他人看到它时,它会为我更新该消息,该消息使用两个勾号看到。这里只是看到的消息得到更新,而不是每次都更新所有消息 (2认同)