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

Hiển thị Hình Ảnh trong Flutter: Image.network, Image.asset và Xử lý Lỗi Hiệu Quả

0 0 2

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

Theo Viblo Asia

Flutter là một framework tuyệt vời để xây dựng giao diện người dùng đẹp mắt và hiệu quả. Một trong những thành phần không thể thiếu trong hầu hết các ứng dụng là hình ảnh. Trong bài viết này, chúng ta sẽ khám phá cách hiển thị hình ảnh từ các nguồn khác nhau bằng cách sử dụng Image.networkImage.asset, cùng với các kỹ thuật xử lý lỗi quan trọng để đảm bảo trải nghiệm người dùng mượt mà.

1. Hiển thị Hình Ảnh từ Internet với Image.network

Khi bạn cần hiển thị hình ảnh được tải từ một URL trên internet, Image.network là widget chúng ta cần. Nó đơn giản và dễ sử dụng.

Cách sử dụng cơ bản:

Image.network( 'https://storage.googleapis.com/cms-storage-bucket/6a07d8a62f4308d2b854.svg',
)

Một số thuộc tính hữu ích:

  • fit: Kiểm soát cách hình ảnh được điều chỉnh để phù hợp với không gian có sẵn (ví dụ: BoxFit.cover, BoxFit.contain, BoxFit.fill).
  • width, height: Đặt kích thước cụ thể cho hình ảnh.
  • loadingBuilder: Một widget builder được hiển thị trong khi hình ảnh đang được tải.
  • errorBuilder: Một widget builder được hiển thị khi có lỗi tải hình ảnh.

2. Hiển thị Hình Ảnh cục bộ với Image.asset

Đối với hình ảnh được đóng gói cùng với ứng dụng của chúng ta (ví dụ: logo, icon), bạn sẽ sử dụng Image.asset. Để sử dụng Image.asset, chúng ta cần thực hiện hai bước chính:

Bước 1: Thêm hình ảnh vào thư mục assets của bạn Thông thường, chúng ta tạo một thư mục có tên assets (hoặc bất kỳ tên nào chúng ta muốn) ở cấp gốc của dự án Flutter của mình và đặt hình ảnh vào đó. Ví dụ: assets/images/my_image.png.

Bước 2: Khai báo hình ảnh trong pubspec.yaml Chúng ta cần cho Flutter biết về các tài nguyên (assets) của chúng ta bằng cách thêm chúng vào tệp pubspec.yaml.

flutter: uses-material-design: true assets: - assets/images/my_image.png - assets/images/another_image.jpg # Hoặc nếu bạn muốn bao gồm tất cả các file trong một thư mục: # - assets/images/

Cách sử dụng Image.asset:

Image.asset('assets/images/my_image.png')

3. Xử lý Lỗi Hình Ảnh Hiệu Quả

Xử lý lỗi là một phần quan trọng để tạo ra một ứng dụng mạnh mẽ. Cả Image.networkImage.asset đều cung cấp các cơ chế để chúng ta có thể phản ứng khi có vấn đề xảy ra.

3.1. Xử lý lỗi với errorBuilder

Cả Image.networkImage.asset đều có thuộc tính errorBuilder. Thuộc tính này cho phép chúng ta cung cấp một widget thay thế để hiển thị khi hình ảnh không thể tải được.

Image.network( 'https://url-hinh-anh-bi-loi.com/hinh.png', errorBuilder: (context, error, stackTrace) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.error, color: Colors.red, size: 40), SizedBox(height: 8), Text( 'Không thể tải hình ảnh.', style: TextStyle(color: Colors.grey), ), ], ); },
)

Tương tự cho Image.asset:

Image.asset( 'assets/images/hinh_khong_ton_tai.png', errorBuilder: (context, error, stackTrace) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.broken_image, color: Colors.orange, size: 40), SizedBox(height: 8), Text( 'Hình ảnh asset không tìm thấy.', style: TextStyle(color: Colors.grey), ), ], ); },
)

Trong errorBuilder, chúng ta nhận được context, đối tượng error (chứa thông tin về lỗi), và stackTrace (dấu vết ngăn xếp). Chúng ta có thể sử dụng thông tin này để hiển thị thông báo lỗi chi tiết hơn hoặc ghi log.

3.2. Hiển thị Loading Indicator với loadingBuilder (chỉ Image.network)

Đối với Image.network, chúng ta có thể sử dụng loadingBuilder để hiển thị một widget trong khi hình ảnh đang được tải. Điều này cải thiện trải nghiệm người dùng bằng cách cung cấp phản hồi trực quan.

Image.network( 'https://storage.googleapis.com/cms-storage-bucket/6a07d8a62f4308d2b854.svg', loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent? loadingProgress) { if (loadingProgress == null) { return child; } return Center( child: CircularProgressIndicator( value: loadingProgress.expectedTotalBytes != null ? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : null, ), ); }, errorBuilder: (context, error, stackTrace) { return Text('Lỗi tải ảnh!'); },
)

Trong loadingBuilder, chúng ta có thể kiểm tra loadingProgress để xác định xem hình ảnh đã tải xong hay chưa. Nếu loadingProgress là null, tức là hình ảnh đã tải xong và chúng ta nên trả về child (là chính widget hình ảnh). Nếu không, chúng ta có thể hiển thị một CircularProgressIndicator hoặc bất kỳ widget nào khác để chỉ báo trạng thái tải.

4. Kết luận

Hiển thị hình ảnh là một tác vụ cơ bản nhưng quan trọng trong phát triển ứng dụng Flutter. Bằng cách sử dụng Image.networkImage.asset cùng với các kỹ thuật xử lý lỗi như errorBuilderloadingBuilder, chúng ta có thể xây dựng các ứng dụng mạnh mẽ, cung cấp trải nghiệm người dùng mượt mà và thông báo rõ ràng khi có sự cố.

Hãy luôn nhớ xử lý các trường hợp ngoại lệ để ứng dụng của chúng ta không bị crash và cung cấp thông tin hữu ích cho người dùng.

Trong bài tiếp theo chúng ta sẽ khám phá cách Làm việc với dữ liệu bất đồng bộ trong Flutter bằng cách sử dụng async, Future, và FutureBuilder.

Cảm ơn các bạn đã theo dõi. Nếu bài viết có điều gì thiếu sót thì mong các bạn góp ý ở phần bình luận nhé 😊

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

Flutter Animation: Creating medium’s clap animation in flutte Part II

Trong phần 1 mình đã giới thiệu với các bạn cơ bản về Animation trong Flutter. Score Widget Size Animation.

0 0 69

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

Flutter - GetX - Using GetConnect to handle API request (Part 4)

Giới thiệu. Xin chào các bạn, lại là mình với series về GetX và Flutter.

0 0 369

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

StatefulWidget và StatelessWidget trong Flutter

I. Mở đầu. Khi các bạn build một ứng dụng với Flutter thì Widgets là thứ không thể thiếu đúng không ạ. Và 2 loại Widget không thể thiếu đó là StatefullWidget và StatelessWidget.

0 0 156

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

Tìm hiểu về Riverpod - Provider nhưng không hắn :v

Trong Flutter có rất nhiều các quản lý state: Provider, Bloc, GetX, Redux,... khó mà nói cái nào tốt hơn cái nào. Tuy nhiên nếu bạn đã làm quen với Provider thì không ngại để tìm hiểu thêm về Riverpod. Một bản nâng cấp của Provider. Nếu bạn để ý thì cái tên "Riverpod" là các chữ cái của "Provider" đ

0 0 71