Hiển thị danh sách với ListView trong Flutter

0 0 0

Người đăng: Coder Tập Sự

Theo Viblo Asia

👋 Chào mừng trở lại với hành trình khám phá Flutter!

Tiếp nối chuỗi bài viết về các widget cơ bản nhưng vô cùng mạnh mẽ trong Flutter, hôm nay chúng ta sẽ cùng nhau đi sâu vào một thành phần không thể thiếu trong hầu hết mọi ứng dụng: ListView.

Bạn đã bao giờ lướt qua danh sách bạn bè trên mạng xã hội, xem danh sách sản phẩm trong một ứng dụng mua sắm, hay đọc danh sách các bài hát yêu thích của mình chưa? Tất cả những giao diện đó đều được xây dựng dựa trên ý tưởng của một danh sách có thể cuộn được.

Trong Flutter, ListView chính là chìa khóa để tạo ra những trải nghiệm cuộn mượt mà và hiệu quả cho người dùng khi hiển thị một tập hợp dữ liệu. Dù bạn đang làm việc với một vài item tĩnh hay hàng ngàn dữ liệu động từ API, ListView đều cung cấp các công cụ mạnh mẽ để đáp ứng nhu cầu của bạn.

Vậy, ListView là gì? Nó hoạt động như thế nào? Và có những cách nào để chúng ta sử dụng nó một cách hiệu quả trong Flutter? Hãy cùng nhau khám phá trong bài viết hôm nay nhé!

🧠 Mục tiêu bài học hôm nay

Trong bài hôm nay chúng ta sẽ cùng làm quen với cách hiển thị danh sách dữ liệu trong Flutter bằng ListView, một trong những widget quan trọng nhất để làm ứng dụng có nhiều nội dung.

📦 ListView là gì?

Trong Flutter, ListView là một widget mạnh mẽ giúp hiển thị danh sách các item có thể cuộn theo chiều dọc (hoặc ngang nếu bạn cấu hình thuộc tính scrollDirection). Nó tương tự như thẻ <ul> hay danh sách trong HTML, nhưng được tối ưu hóa cho hiệu suất và khả năng tương tác trên thiết bị di động.

🚀 Các cách tạo ListView

1. ListView() – danh sách tĩnh

Sử dụng khi bạn có một số lượng nhỏ các item đã biết trước và không thay đổi. Tất cả các item sẽ được tạo ra cùng một lúc.

ListView( children: [ ListTile(title: Text('Mục 1')), ListTile(title: Text('Mục 2')), ListTile(title: Text('Mục 3')), ],
)

2. ListView.builder() – danh sách động

Đây là cách thường được sử dụng nhất, đặc biệt khi làm việc với danh sách lớn hoặc dữ liệu động. ListView.builder() chỉ tạo ra các item khi chúng sắp được hiển thị trên màn hình, giúp tối ưu hóa hiệu suất và giảm mức tiêu thụ bộ nhớ.

ListView.builder( itemCount: 10, itemBuilder: (context, index) { return ListTile( title: Text('Luân thích số $index'), leading: Icon(Icons.star), trailing: Icon(Icons.arrow_forward_ios), onTap: () { print('Bạn đã chọn mục $index'); }, ); },
)

3. ListView.separated() – có khoảng cách giữa các mục

Tương tự như ListView.builder(), nhưng cho phép bạn chèn một widget phân cách (ví dụ: Divider() để tạo đường kẻ ngang) giữa mỗi item. Rất hữu ích để tạo giao diện danh sách rõ ràng và dễ đọc.

ListView.separated( itemCount: 10, separatorBuilder: (context, index) => Divider(), itemBuilder: (context, index) { return ListTile(title: Text('Mục $index')); },
)

Ví dụ đầy đủ

import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget {  Widget build(BuildContext context) { return MaterialApp( home: DanhSachYeuThich(), ); }
} class DanhSachYeuThich extends StatelessWidget { final List<String> danhSach = [ 'Học Flutter', 'Xem phim', 'Nghe nhạc', 'Chạy bộ', 'Viết blog', ];  Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Danh sách của Luân')), body: ListView.builder( itemCount: danhSach.length, itemBuilder: (context, index) { return ListTile( title: Text(danhSach[index]), leading: Icon(Icons.favorite), trailing: Icon(Icons.chevron_right), onTap: () { print('Luân chọn: ${danhSach[index]}'); }, ); }, ), ); }
}

Một số lỗi phổ biến

  • Danh sách bị tràn: Nếu bạn đặt ListView trong một widget có chiều cao không xác định như Column, hãy nhớ bọc nó trong Expanded hoặc SizedBox.
  • Danh sách không cuộn được: Kiểm tra xem bạn có đang dùng SingleChildScrollView lồng bên ngoài không – có thể gây lỗi.
  • Hiệu suất kém với danh sách lớn (ListView()): Đối với danh sách có nhiều item, hãy ưu tiên sử dụng ListView.builder() để chỉ tạo các widget cần thiết, giúp ứng dụng chạy mượt mà hơn.

Lời kết

Trong bài học hôm nay, chúng ta đã khám phá ba cách cơ bản để hiển thị danh sách cuộn trong Flutter với widget ListView: ListView() cho danh sách tĩnh, ListView.builder() cho danh sách động và hiệu suất cao, và ListView.separated() khi bạn muốn thêm các widget phân cách giữa các item. Việc lựa chọn phương pháp nào sẽ phụ thuộc vào tính chất dữ liệu và yêu cầu hiệu suất của ứng dụng.

Trong các bài viết tiếp theo, chúng ta có thể sẽ tìm hiểu về cách hiển thị dữ liệu theo dạng lưới với GridView hoặc đi sâu hơn vào việc tùy chỉnh và tối ưu hóa hiệu suất hiển thị danh sách. Hãy cùng đón chờ những chủ đề thú vị tiếp theo nhé! 😎

Cảm ơn mọi người đã dành thời gian theo dõi bài viết này! Nếu có bất kỳ câu hỏi hay chia sẻ nào, đừng ngần ngại bình luận bên dưới.

Hẹn gặp lại! 😊

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 299

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

1 1 357

- vừa được xem lúc

Dart Cheat Sheet - Full bộ "bỏ túi" các syntax trong ngôn ngữ Dart

Dart là một ngôn ngữ mới dùng cho cả Mobile và Web với Flutter Framework, thậm chí dùng cho Backend. Để giúp mọi người dễ dàng nắm bắt ngôn ngữ này hơn, 200lab Education đã tổng hợp thành bộ "bí tịch" dưới đây để tra cứu nhanh, tăng tốc phát triển phần mềm.

0 0 54

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 2: StatefulWidget vs StatelessWidget. Khi nào thì cần sử dụng cái nào?

Lời mở đầu. Ở bài trước, chúng ta đã dừng lại ở một kết thúc mở.

0 0 102

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 4: Lột trần InheritedWidget

Lời mở đầu. Trong đoạn kết của phần 2, chúng ta đã đối mặt với 1 bài toán: Làm thế nào để truyền data từ một widget cha nào đó xuống thẳng widget chắt mà không phải sử dụng constructor để truyền xuống

0 0 72

- vừa được xem lúc

Chinh phục RxDart Flutter trong 3 nốt nhạc. Nốt thứ nhất: Stream và giải thích các thuật ngữ

Lời mở đầu. Mình viết series này với mục đích chia sẻ kiến thức về RxDart trong Flutter.

0 0 80