aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

ValueNotifier trong Flutter: cập nhật list để giao diện nhận đúng thay đổi

Suong Nguyen by Suong Nguyen
23/10/2026
in Flutter
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn có một danh sách nhỏ trên màn hình Flutter, dùng ValueNotifier<List<String>> để lưu dữ liệu. Sau khi gọi notifier.value.add(...), log cho thấy list đã có phần tử mới nhưng giao diện chưa thay đổi. Khi một sự kiện khác làm màn hình build lại, phần tử bỗng xuất hiện.

Nguyên nhân thường nằm ở cách phát thông báo thay đổi. Bài này giải thích cơ chế đó và đưa một màn hình nhỏ để bạn tự kiểm tra. API được đối chiếu tài liệu Flutter ngày 23/10/2026. Ví dụ dùng thư viện Flutter tích hợp, không thêm package quản lý state; chưa chạy Flutter SDK hay kiểm thử thiết bị trong lượt biên tập.

Notifier theo dõi giá trị được gán

ValueNotifier phát thông báo khi giá trị mới được gán khác giá trị cũ theo toán tử ==. Nó không tự quan sát mọi thay đổi bên trong một object đang được giữ. Với list thông thường, sửa phần tử tại chỗ không tạo ra một lần gán giá trị khác để notifier xử lý.

Do đó, gọi value.add(...) rồi gán lại chính list ấy vào value cũng dễ không phát thông báo như mong muốn. Một cách rõ ràng cho state nhỏ là tạo list mới sau mỗi thao tác và tránh cho nơi khác sửa trực tiếp list đã công bố.

Phép so sánh này cũng có hệ quả với kiểu dữ liệu tự định nghĩa. Nếu bạn override ==, việc một instance mới có làm notifier phát thông báo hay không còn phụ thuộc hợp đồng equality của kiểu đó. Đừng chỉ nhìn thấy từ khóa new rồi kết luận chắc chắn có cập nhật UI.

Một màn hình có chủ sở hữu state rõ ràng

Bạn có thể đặt ví dụ dưới vào lib/main.dart của dự án Flutter thử đã được tạo. State tạo notifier một lần, gán list mới khi bấm nút và giải phóng tài nguyên khi màn hình bị gỡ khỏi cây widget.

import 'package:flutter/material.dart';

void main() => runApp(const MaterialApp(home: NotesPage()));

class NotesPage extends StatefulWidget {
  const NotesPage({super.key});

  @override
  State<NotesPage> createState() => _NotesPageState();
}

class _NotesPageState extends State<NotesPage> {
  final _notes = ValueNotifier<List<String>>(const []);

  void _addNote() {
    final next = 'Ghi chu ${_notes.value.length + 1}';
    _notes.value = List<String>.unmodifiable([..._notes.value, next]);
  }

  @override
  void dispose() {
    _notes.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ValueNotifier demo')),
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: ValueListenableBuilder<List<String>>(
          valueListenable: _notes,
          child: const Text('Danh sach ghi chu'),
          builder: (context, notes, child) => Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              child!,
              Text(notes.isEmpty ? 'Chua co ghi chu' : notes.join(', ')),
              FilledButton(onPressed: _addNote, child: const Text('Them')),
            ],
          ),
        ),
      ),
    );
  }
}

List.unmodifiable giúp ngăn thay đổi cấu trúc list đã công bố. Trong ví dụ, phần tử là chuỗi nên mô hình khá đơn giản. Nếu phần tử là object có trường mutable, bọc list không khiến các object bên trong trở thành bất biến; bạn vẫn cần quy tắc cập nhật cho từng phần tử.

Builder tự đăng ký listener, ownership vẫn do bạn quyết định

ValueListenableBuilder theo dõi ValueListenable và gọi builder khi có thông báo. Bạn không cần tự gọi setState thêm chỉ để đồng bộ lại cùng dữ liệu này. Tạo notifier ngay trong build sẽ làm vòng đời dữ liệu khó kiểm soát và có thể mất state khi widget cha build lại.

Ở ví dụ, màn hình sở hữu notifier nên màn hình gọi dispose. Nếu notifier được truyền vào từ một tầng khác, tầng tạo và sở hữu nó phải quyết định khi nào giải phóng; widget chỉ mượn không nên tùy tiện dispose một tài nguyên còn được nơi khác dùng.

Tham số child chứa phần giao diện không phụ thuộc danh sách. Việc truyền sẵn subtree có thể tránh tạo lại phần đó trong mỗi lần builder được gọi. Đây là cách tổ chức code theo tài liệu, không phải số đo tối ưu hiệu năng cho mọi màn hình.

Tự kiểm tra theo hành vi

Ghi lại kết quả flutter --version, chạy flutter analyze, rồi thử trên một thiết bị hoặc emulator của dự án. Ban đầu phải có trạng thái rỗng. Mỗi lần bấm nút, danh sách tăng đúng một mục mà không cần thao tác khác khiến màn hình build lại.

Để hiểu lỗi ban đầu, thử thay riêng phần cập nhật bằng mutation tại chỗ trên một list mutable trong dự án thử và quan sát listener. Sau đó khôi phục cách gán list mới. Đừng để phép thử sửa dữ liệu trực tiếp tồn tại trong code production rồi bù bằng một lần rebuild ngẫu nhiên ở màn hình cha.

Khi có widget test, kiểm tra trạng thái trước và sau một lần bấm, nhiều lần bấm và lúc màn hình được mở lại. Mục tiêu là chứng minh hợp đồng dữ liệu, không đếm số lần build rồi suy luận toàn bộ app đã nhanh hơn.

Khi state lớn dần

Nếu nhiều màn hình cùng chỉnh dữ liệu, có quy trình tải/lưu phức tạp hoặc nhiều trường cần cập nhật đồng thời, hãy đưa logic ra một lớp có trách nhiệm rõ hơn. Tài liệu gợi ý ChangeNotifier khi cần quản lý object mutable và phát thông báo chủ động; các kiến trúc state khác cũng cần được chọn theo yêu cầu thực tế.

Một notifier cho state nhỏ có thể rất dễ đọc. Điều cần giữ là quy tắc equality, cách công bố giá trị mới và chủ sở hữu tài nguyên được thể hiện nhất quán trong code.

Nguồn tham khảo

  • Flutter: ValueNotifier và giới hạn với dữ liệu mutable
  • Flutter: ValueListenableBuilder và tham số child
  • Flutter: ChangeNotifier.dispose

Tags: FlutterState managementValueNotifier
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

Tìm kiếm Flutter: debounce và chặn response cũ ghi đè kết quả mới

by Suong Nguyen
22/10/2026
0

Kết hợp Timer, mã phiên truy vấn và kiểm tra mounted để màn hình tìm kiếm không hiển thị nhầm kết quả khi mạng trả về lệch thứ...

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

FutureBuilder trong Flutter: đừng tạo Future mới trong build

by Suong Nguyen
21/10/2026
0

Giữ Future ổn định trong State, hiển thị loading, lỗi và dữ liệu rỗng, đồng thời chỉ tải lại khi người dùng yêu cầu.

Minh họa phát triển ứng dụng mobile đa nền tảng với Flutter

Bắt đầu với Flutter: khi nào nên chọn cho dự án mobile?

by admin
02/07/2026
0

Flutter là lựa chọn đáng cân nhắc khi cần phát triển ứng dụng iOS và Android với một codebase, UI nhất quán và tốc độ ra sản phẩm...

Minh họa so sánh React Native và Flutter cho phát triển mobile

React Native hay Flutter: chọn gì cho sản phẩm mới?

by admin
02/07/2026
0

React Native và Flutter đều mạnh cho mobile cross-platform, nhưng phù hợp với những kiểu team và sản phẩm khác nhau.

Next Post
Minh họa dùng SSH key để kết nối GitHub an toàn

Git restore: hiểu HEAD, staged và working tree trước khi hoàn tác

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native: làm nút icon dễ sử dụng với VoiceOver và TalkBack
  • Phỏng vấn JavaScript: vì sao spread vẫn có thể làm đổi object gốc?
  • Android Photo Picker: chọn ảnh bằng URI và quản lý quyền đọc đúng vòng đời

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply