Skip to Content
Flutter🧭 Navigation🚀 Navigation cơ bản

Navigation cơ bản trong Flutter

1. Navigator là gì?

Flutter sử dụng Navigator để quản lý stack các routes (screens):

┌─────────────┐ │ Screen C │ ← Top of stack (visible) ├─────────────┤ │ Screen B │ ├─────────────┤ │ Screen A │ ← Bottom of stack └─────────────┘

2. Navigator.push

Thêm screen mới lên stack:

Navigator.push( context, MaterialPageRoute( builder: (context) => SecondScreen(), ), );

Shorthand:

Navigator.of(context).push( MaterialPageRoute(builder: (_) => SecondScreen()), );

3. Navigator.pop

Quay lại screen trước:

Navigator.pop(context);

Hoặc:

Navigator.of(context).pop();

4. Ví dụ đầy đủ

Screen 1

class FirstScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('First Screen')), body: Center( child: ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (_) => SecondScreen()), ); }, child: Text('Go to Second'), ), ), ); } }

Screen 2

class SecondScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Second Screen')), body: Center( child: ElevatedButton( onPressed: () { Navigator.pop(context); }, child: Text('Go Back'), ), ), ); } }

5. pushReplacement

Thay thế screen hiện tại (không thể back):

Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => HomeScreen()), );

Use case: Sau khi login, replace LoginScreen bằng HomeScreen.


6. pushAndRemoveUntil

Push screen mới và xóa các screens trước đó:

// Xóa tất cả và push Home Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => HomeScreen()), (route) => false, // Xóa tất cả ); // Xóa đến khi gặp route có tên '/home' Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => ProfileScreen()), ModalRoute.withName('/home'), );

Use case: Logout - clear stack và về LoginScreen.


7. popUntil

Pop về screen cụ thể:

// Pop về screen đầu tiên Navigator.popUntil(context, (route) => route.isFirst); // Pop về named route Navigator.popUntil(context, ModalRoute.withName('/home'));

8. canPop và maybePop

Kiểm tra có thể pop không:

if (Navigator.canPop(context)) { Navigator.pop(context); } // Hoặc Navigator.maybePop(context); // Pop nếu có thể

9. WillPopScope - Handle back button

WillPopScope( onWillPop: () async { // Return true để pop, false để không final shouldPop = await showDialog<bool>( context: context, builder: (context) => AlertDialog( title: Text('Exit?'), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), child: Text('No'), ), TextButton( onPressed: () => Navigator.pop(context, true), child: Text('Yes'), ), ], ), ); return shouldPop ?? false; }, child: Scaffold(...), )

Flutter 3.12+: Dùng PopScope thay cho WillPopScope

PopScope( canPop: false, onPopInvoked: (didPop) async { if (didPop) return; // Show confirmation dialog }, child: Scaffold(...), )

10. PageRouteBuilder - Custom Transition

Navigator.push( context, PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => SecondScreen(), transitionsBuilder: (context, animation, secondaryAnimation, child) { // Fade transition return FadeTransition(opacity: animation, child: child); // Slide transition // return SlideTransition( // position: Tween<Offset>( // begin: Offset(1.0, 0.0), // end: Offset.zero, // ).animate(animation), // child: child, // ); }, ), );

📝 Tóm tắt

MethodMô tả
pushThêm screen vào stack
popQuay lại screen trước
pushReplacementThay thế screen hiện tại
pushAndRemoveUntilPush và xóa các screens
popUntilPop về screen cụ thể
canPopKiểm tra có thể pop
maybePopPop nếu có thể
Last updated on