跳至主要內容

處理長列表

標準的 ListView 建構函式適用於小型列表。若要處理包含大量項目的列表,最好使用 ListView.builder 建構函式。

與預設的 ListView 建構函式要求一次建立所有項目不同,ListView.builder() 建構函式會在項目捲動到螢幕上時建立項目。

1. 建立資料來源

#

首先,你需要一個資料來源。例如,你的資料來源可能是一串訊息、搜尋結果,或商店中的產品。大多數情況下,這些資料來自網路或資料庫。

在這個範例中,使用 List.generate 建構子產生一個包含 10,000 個字串的列表。

dart
List<String>.generate(10000, (i) => 'Item $i'),

2. 將資料來源轉換為 Widget

#

為了顯示字串列表,使用 ListView.builder() 將每個字串渲染成一個 widget。在這個範例中,將每個字串顯示在單獨的一行上。

dart
ListView.builder(
  itemCount: items.length,
  prototypeItem: ListTile(
    title: Text(items.first),
  ),
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
)

互動範例

#
import 'package:flutter/material.dart';

void main() {
  runApp(
    MyApp(
      items: List<String>.generate(10000, (i) => 'Item $i'),
    ),
  );
}

class MyApp extends StatelessWidget {
  final List<String> items;

  const MyApp({super.key, required this.items});

  @override
  Widget build(BuildContext context) {
    const title = 'Long List';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        body: ListView.builder(
          itemCount: items.length,
          prototypeItem: ListTile(
            title: Text(items.first),
          ),
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(items[index]),
            );
          },
        ),
      ),
    );
  }
}

子項範圍

#

為了指定每個項目的範圍,你可以使用 prototypeItemitemExtentitemExtentBuilder

指定其中任何一個都比讓子元件自行決定其範圍更有效率,因為滾動機制可以利用預先知道子元件範圍的資訊來節省工作,例如當滾動位置發生劇烈變化時。

如果你的列表項目具有固定大小,請使用 prototypeItemitemExtent

如果你的列表項目具有不同大小,請使用 itemExtentBuilder