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 Offstage và TickerMode: ẩn widget chưa đủ để ngừng ticker

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

Bạn muốn giữ một vùng giao diện trong cây để mở lại, nhưng vùng đó chứa animation chạy liên tục. Chỉ nhìn thấy màn hình không còn vẽ phần ấy chưa cho biết ticker đã im. Hãy tách quyết định về layout và hiển thị khỏi quyết định về nguồn cập nhật animation.

Dùng hai lớp cho hai trách nhiệm

Theo tài liệu Flutter được đối chiếu ngày 12/11/2026, Offstage vẫn layout child, nhưng khi offstage thì không paint, không hit test và không chiếm chỗ trong parent. Widget con vẫn có thể hoạt động. TickerMode điều khiển ticker trong subtree khi controller dùng ticker provider gắn với widget.

Đoạn sau là thành phần để đặt trong màn hình Material hiện có. Màn hình cha truyền visible khi đổi chế độ. Không gỡ AnimatedPanel khỏi cây nếu mục tiêu là giữ State qua lần ẩn.

import 'package:flutter/material.dart';

class AnimatedPanel extends StatefulWidget {
  const AnimatedPanel({super.key, required this.visible});
  final bool visible;

  @override
  State<AnimatedPanel> createState() => _AnimatedPanelState();
}

class _AnimatedPanelState extends State<AnimatedPanel> {
  @override
  Widget build(BuildContext context) {
    return Offstage(
      offstage: !widget.visible,
      child: TickerMode(
        enabled: widget.visible,
        child: const _Spinner(),
      ),
    );
  }
}

class _Spinner extends StatefulWidget {
  const _Spinner();

  @override
  State<_Spinner> createState() => _SpinnerState();
}

class _SpinnerState extends State<_Spinner>
    with SingleTickerProviderStateMixin {
  late final AnimationController controller;

  @override
  void initState() {
    super.initState();
    controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 2),
    )..repeat();
  }

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

  @override
  Widget build(BuildContext context) {
    return RotationTransition(
      turns: controller,
      child: const Icon(Icons.refresh),
    );
  }
}

Provider nằm trong _Spinner, bên dưới TickerMode. Nếu controller được tạo ở một State bên ngoài rồi chỉ truyền animation vào child, cần kiểm tra lại nơi ticker nhận mode; vị trí widget vẽ không tự quyết định ticker của controller bên ngoài.

Cách kiểm tra

Gắn nút đổi visible ở cha, để vùng xoay hiện rồi ẩn. Kiểm tra vùng ẩn không chiếm chỗ và không nhận thao tác chạm. Khi cần xác minh ticker, theo dõi callback của controller trong một lượt debug ngắn; không chỉ nhìn ảnh đứng yên. Hiện lại và kiểm tra animation tiếp tục cập nhật. Đừng giả định rằng mute ticker sẽ đóng băng thời gian theo nghĩa nghiệp vụ.

Tài liệu cũng lưu ý child offstage vẫn có thể nhận focus. Nếu vùng thật chứa ô nhập, hãy kiểm tra điều hướng bàn phím và quản lý focus riêng. TickerMode không hủy Timer, subscription hoặc request. Nếu phần ẩn không cần giữ state, cân nhắc gỡ widget để đơn giản hóa vòng đời.

Giới hạn và kết luận

Mẫu đã được rà theo API, chưa chạy SDK, analyzer, thiết bị hay đo pin. Dùng Offstage khi cần giữ child nhưng không vẽ, và kiểm tra ticker tại đúng subtree khi animation không cần cập nhật trong lúc ẩn.

Nguồn tham khảo

  • Flutter: Offstage
  • Flutter: TickerMode

Tags: AnimationFlutterWidget
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 bottom sheet có ô nhập: chừa chỗ cho bàn phím bằng viewInsets

by Suong Nguyen
11/11/2026
0

Ghép showModalBottomSheet, padding theo viewInsets và vùng cuộn để kiểm tra form ngắn khi bàn phím xuất hiện.

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

Flutter AnimatedOpacity: opacity bằng 0 chưa tự chặn thao tác chạm

by Suong Nguyen
10/11/2026
0

Tách độ trong suốt, hit testing và semantics khi làm nút biến mất bằng AnimatedOpacity, với cùng một state điều khiển từng phần.

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

Flutter DropdownButton: value cần khớp đúng một item, không phải một nhãn

by Suong Nguyen
09/11/2026
0

Dùng ID ổn định làm value của DropdownButton để hai mục có cùng nhãn vẫn được chọn đúng, kèm cách rà lựa chọn đã hết tồn tại.

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

Flutter TextField: readOnly khác enabled như thế nào với nút suffix?

by Suong Nguyen
08/11/2026
0

Chọn trạng thái TextField khi cần ngăn sửa nội dung, vẫn cho chọn chữ hoặc giữ nút suffix hoạt động, kèm màn hình kiểm tra hai trường.

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

Git branch --merged: đọc danh sách theo đúng nhánh đích sau squash

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 Keyboard.dismiss: đóng bàn phím mà vẫn giữ bản nháp
  • Map.get trả undefined: khóa không tồn tại hay đã lưu giá trị undefined?
  • Handler.removeCallbacks: giữ đúng Runnable để hủy tác vụ chờ

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