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

Flutter AnimatedSwitcher: đổi nội dung cần đúng key để có transition

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

Bạn bọc một Text bằng AnimatedSwitcher, tăng bộ đếm nhưng chỉ thấy chữ thay ngay. Trước khi chỉnh curve hay kéo dài duration, hãy kiểm tra Flutter có nhận đó là child mới hay chỉ cập nhật widget hiện tại.

Bài đối chiếu Flutter API ngày 03/11/2026. Demo được rà thủ công về cây widget, state và hợp đồng key; chưa chạy Flutter SDK, widget test hay thiết bị. Thời lượng 300 ms là cấu hình minh họa, không phải số đo độ mượt hoặc kết quả profiling.

Type và key quyết định cách nhận diện child

Theo tài liệu AnimatedSwitcher, cùng loại widget và cùng key thì tham số mới có thể cập nhật widget hiện có, không tạo transition giữa hai child. Với bộ đếm, đặt ValueKey(count) trên chính Text giúp mỗi giá trị đếm có danh tính mà switcher nhận ra.

Đặt key trên widget bọc sai cấp có thể không thể hiện ý định đó. Cũng không cần tạo UniqueKey mới ở mọi lần build: một rebuild do lý do khác không nên tự bị hiểu là dữ liệu đếm đã thay.

Một demo có đủ state và điểm cập nhật

Có thể đặt vào lib/main.dart của project Material thử:

import 'package:flutter/material.dart';

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

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

  @override
  State<CounterDemo> createState() => _CounterDemoState();
}

class _CounterDemoState extends State<CounterDemo> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    final disableAnimations = MediaQuery.of(context).disableAnimations;
    return Scaffold(
      appBar: AppBar(title: const Text('Đổi nội dung')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            AnimatedSwitcher(
              duration: disableAnimations
                  ? Duration.zero
                  : const Duration(milliseconds: 300),
              child: Text(
                '$count',
                key: ValueKey<int>(count),
                style: const TextStyle(fontSize: 48),
              ),
            ),
            const SizedBox(height: 16),
            FilledButton(
              onPressed: () => setState(() => count += 1),
              child: const Text('Tăng một'),
            ),
          ],
        ),
      ),
    );
  }
}

Key lấy từ đúng dữ liệu đang hiển thị và không thay nếu count giữ nguyên. State tăng trong callback của nút, không tăng trong build. Demo dùng transition mặc định; chưa có custom builder hoặc tải dữ liệu bất đồng bộ để đánh giá thêm.

Kiểm tra bằng hai trường hợp đối chứng

Trên project thử, chạy bản có ValueKey<int>(count) rồi tăng chậm từng lần. Sau đó bỏ dòng key và so sánh cùng chuỗi thao tác. Đây là kế hoạch kiểm tra nhận diện child theo tài liệu, chưa phải hai bản build đã được chạy trong bài.

Thử bấm nhanh khi transition cũ chưa xong. AnimatedSwitcher có thể giữ nhiều child đang thoát; đừng giả định cây chỉ có đúng hai Text ở mọi thời điểm. Với nội dung thật dài hoặc có kích thước khác nhau, cần quan sát thêm bố cục trong quá trình chuyển, không chỉ trạng thái cuối.

Xử lý yêu cầu giảm animation theo phạm vi thật

Ví dụ đọc MediaQueryData.disableAnimations và đặt duration bằng 0 khi cờ này bật. Tài liệu hiện tại nêu cờ tương ứng với Remove animations trên Android; iOS reduce motion được cung cấp riêng qua accessibility features, không tự đặt cờ này.

Vì vậy, demo không phải triển khai hỗ trợ giảm chuyển động hoàn chỉnh cho mọi nền tảng. Khi đưa vào app iOS hoặc thiết kế animation riêng, cần đối chiếu tín hiệu và chính sách accessibility tương ứng, rồi kiểm tra trên thiết bị mục tiêu.

Những lỗi dễ gặp khi tích hợp

Key cố định như ValueKey('counter') không phân biệt các số đếm. Key thay đổi ngẫu nhiên lại biến mọi rebuild thành thay child. Cách chọn key nên xuất phát từ điều gì được xem là nội dung mới, không từ mong muốn ép animation chạy bằng mọi cách.

Nếu đổi cả cụm loading, error và content, có thể chọn key biểu diễn trạng thái, nhưng vẫn phải định nghĩa việc cập nhật nội dung trong cùng trạng thái có cần transition hay không. Animation không thay cơ chế quản lý state hoặc đảm bảo dữ liệu mới nhất.

Bắt đầu từ counter để kiểm chứng type, key và duration. Khi ba điều này rõ, bạn mới có cơ sở mở rộng sang nội dung phức tạp và đánh giá chuyển động bằng build thực tế.

Nguồn tham khảo

  • Flutter: AnimatedSwitcher và cách nhận diện child
  • Flutter: ValueKey
  • Flutter: MediaQueryData.disableAnimations và phạm vi nền tảng

Tags: AnimationFlutterWidget keys
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

Flutter RefreshIndicator: kéo làm mới cả danh sách ngắn

by Suong Nguyen
02/11/2026
0

Đặt AlwaysScrollableScrollPhysics trên ListView và trả đúng Future của lượt tải để thao tác kéo làm mới có vòng đời rõ ràng.

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

Flutter SafeArea: minimum và MediaQuery padding không phải cộng tay

by Suong Nguyen
01/11/2026
0

Đặt SafeArea đúng cấp, hiểu minimum và lý do MediaQuery.padding thay đổi trong subtree đã được xử lý inset.

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

Flutter Dismissible: xác nhận rồi xóa đúng dòng theo ID

by Suong Nguyen
31/10/2026
0

Tách confirmDismiss và onDismissed để hủy thao tác vuốt hoặc xóa đúng mục khỏi danh sách local.

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

Flutter IndexedStack: giữ state riêng khi chuyển giữa hai tab

by Suong Nguyen
30/10/2026
0

Tạo hai bộ đếm trong hai tab để kiểm tra state được giữ trong cây widget và hiểu chi phí của việc giữ các trang sống.

Next Post
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

Git cherry-pick --no-commit: xem thay đổi trước khi tạo commit

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 Text: rút gọn hai dòng và vẫn có đường đọc đầy đủ
  • Vì sao map(parseInt) biến index thành radix?
  • Android INVISIBLE và GONE: ẩn nội dung có cần giữ chỗ không?

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