AppBar hay còn gọi là Thanh công cụ thuộc lớp Scraffold, nó dùng để miêu tả một chức năng hoặc một màn hình nào đó tới người dùng
AppBar được đặt cố định phía trên cùng màn hình (hay trên cùng Scraffold), có chiều cao cố định
AppBar là một lớp chứa bao gồm 5 khu vực leading, title, Tool Bar (actions), flexiableSpace, bottom.
AppBar( {Key key, Widget leading, bool automaticallyImplyLeading: true, Widget title, List actions, Widget flexibleSpace, PreferredSizeWidget bottom, double elevation, Color shadowColor, ShapeBorder shape, Color backgroundColor, Brightness brightness, IconThemeData iconTheme, IconThemeData actionsIconTheme, TextTheme textTheme, bool primary: true, bool centerTitle, bool excludeHeaderSemantics: false, double titleSpacing: NavigationToolbar.kMiddleSpacing, double toolbarOpacity: 1.0, double bottomOpacity: 1.0, double toolbarHeight } )
Leading là một widget hiển thị ngay phía trước của title và nằm bên trái của màn hình
Kiểu của leading có thể là Icon hoặc IconButton
Ví dụ với kiểu là IconButton
appBar: AppBar( title: Text("VTS AppBar Title"), leading: IconButton( icon: Icon(Icons.notifications_active), onPressed: () { // Do something. } ) )
Ví dụ về tạo một IconBotton trong khu vực leading khi kích vào IconBotton sẽ xuất hiện một thông báo
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: LeadingPage (), ); } } class LeadingPage extends StatelessWidget { const LeadingPage ({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("VTS Leading Sample"), leading: IconButton( icon: Icon(Icons.notifications_active), onPressed: () { showAlert(context); } ) ), body: Center( child: Text("VTS chuyên đào tạo Flutter từ đơn giản đến chuyên sâu") ), ); } void showAlert(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( content: Text("Hi"), )); } }
Khi chạy ứng dụng sẽ ra kết quả sau
VD 2 : Hướng dẫn cách tạo ứng dụng có nút tắt/ bật âm thanh.
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { const MyHomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("VTS Leading Title"), leading: MyVolumeButton() ), body: Center( child: Text("VTS nhận đào tạo lập trình Flutter từ A-Z") ), ); } } class MyVolumeButton extends StatefulWidget { const MyVolumeButton({Key? key}) : super(key: key); @override State createState() { return MyVolumeButtonState(); } } class MyVolumeButtonState extends State { bool volumeOn = true; @override Widget build(BuildContext context) { return IconButton( icon: this.volumeOn? Icon(Icons.volume_up):Icon(Icons.volume_mute), onPressed: () { // Set new State setState(() => this.volumeOn = !this.volumeOn); } ); } }
Chạy ứng dụng sẽ ra kết quả sau
AutomaticallyImplyLeading là một thuộc tính (property) có giá trị mặc định là True trong lớp AppBar. Nếu không đặt bất kỳ một Widget nào trong AppBar ứng dụng sẽ tự động thêm vào một Widget phù hợp theo từng ngữ cảnh
VD 1 : Khi bạn tạo một đối tượng Drawer (Ngăn xếp) trên AppBar một đối tượng IconButton sẽ được tự động thêm vào khu vực leading nếu
VD 2 : Một IconButtom BACK sẽ tự động được thêm vào khu vực leading của AppBar để hỗ trợ người dùng quay trở lại màn hình trước nếu
Ví dụ về automaticallyImplyLeading
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { MyHomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( // AppBar with automaticallyImplyLeading = "true" (Default) appBar: AppBar( title: Text("AppBar Title"), automaticallyImplyLeading: true ) body: Center( child: Text("VTS tuyển sinh lập trình Flutter") ), drawer: Drawer( child: ListView children: const [ DrawerHeader( decoration: BoxDecoration( color: Colors.green, ), child: Text( 'My Drawer', style: TextStyle( color: Colors.green, fontSize: 24, ), ), ), ListTile( title: Text('Gallery'), ), ListTile( title: Text('Slideshow'), ), ], ), ), ); } }
Chạy ứng dụng sẽ ra kế quả màn hình như sau
Tilte (tiêu đề) dùng để hiển thị một đoạn văn bản trên Scraffold, nó thường dùng miên tả ngắn ngọn một chức năng hoặc nhiệm vụ nào đó
Ví dụ một AppBar đơn giản
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { const MyHomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("VTS AppBar Title"), ), body: Center( child: Text( 'Hello World', ) ), ); } }
Kết quả hiển thị
Mặc định title sẽ được căn lề bên trái, tuy nhiên bạn có thể căn lại lề theo mong muốn thông qua thuộc tính
Cú pháp câu lệnh như sau :
appBar: AppBar( title: Align ( child: Text("VTS AppBar Title"), alignment: Alignment.center ) ),
Bạn cũng có thể chèn thêm các Icon bên canh title của AppBar, để tạo được icon bạn sẽ phải thêm vào một Widget bao gồm các icon và title
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { const MyHomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: IconTitleWidget() ), body: Center( child: Text( 'VTS chuyên nhận đào tạo lập trình Flutter', ) ), ); } } class IconTitleWidget extends StatelessWidget { @override Widget build(BuildContext context) { imageCache?.clear(); return Row ( mainAxisAlignment: MainAxisAlignment.center, // Centers horizontally crossAxisAlignment: CrossAxisAlignment.center, // Centers vertically children: [ Icon(Icons.train), Icon(Icons.place), // The SizedBox provides an immediate spacing between the widgets SizedBox ( width: 5, ), Text( "VTS Place", ) ], ); } }
Kết quả màn hình
Flexiablespace là một không gian linh hoạt đứng ngay phía dưới AppBar có kích thước chiều cao bằng với chiều cao AppBar
FlexiableSpace dùng để ngăn sách thành phần AppBar với các thành phần khác trong Scraffold
Khu vực action nằm ở phía trên bên phải của Scraffold, dùng để thêm các nút lệnh thực hiện một nhiệm vụ nào đó, nút lệnh (action) thường là các IconButton hoặc PopupMenuButton
Trong ví dụ này chúng ta sẽ thêm 2 nút iconButton và PopupMenuButton
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { const MyHomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("VTS AppBar Title"), actions: [ IconButton( icon: Icon(Icons.file_upload), onPressed: () => { print("Click on upload button") }, ), IconButton( icon: Icon(Icons.settings), onPressed: () => { print("Click on settings button") } ), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ) ] ), body: Center( child: Text( 'VTS nhận đào tạo lập trình Flutter từ A-Z', ) ), ); } }
kết quả thực hiện
Bottom (đáy) là khu vực nằm ở phía cuối cùng của AppBar, nó thường được sử dụng để chứa TabBar
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Title of Application', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage_botton(), ); } } class MyHomePage_botton extends StatelessWidget { const MyHomePage_botton({Key? key}) : super(key: key); Widget build(BuildContext context) { return DefaultTabController( length: 3, child: Scaffold( appBar: AppBar( bottom: TabBar( tabs: [ Tab(icon: Icon(Icons.directions_car)), Tab(icon: Icon(Icons.directions_transit)), Tab(icon: Icon(Icons.directions_bike)), ], ), title: Text('VTS AppBar Example'), ), body: TabBarView ( children: [ Center(child: Text("Car")), Center(child: Text("Transit")), Center(child: Text("Bike") ], ), ) ); } }
Trên đây là toàn bộ bài giới thiệu về AppBar và chi tiết các thành phần trong AppBar, nếu bạn có bất kỳ câu hỏi gì vui lòng liên hệ với VTSoft qua số điện thoại 098 333 0380, VTSoft nhận hướng dẫn thực tập Flutter miễn phí cho các bạn có đam mê lập trình trên Mobile APP
Bài trước: Tìm hiểu lớp Scaffold và các thành phần trong Flutter
Bài tiếp theo: Tìm hiểu BottomAppBar trong Flutter
11/11/2022
28/10/2022
27/10/2022
25/10/2022
22/08/2021
30/08/2021
14/10/2022
24/10/2022
19/08/2021
21/01/2025
24/12/2024
22/08/2024
15/08/2024
08/08/2024
Khám phá sự khác biệt với phần mềm quản trị doanh nghiệp hàng đầu! Đăng ký ngay để sử dụng phần mềm miễn phí.
Nhanh tay đăng ký để được tư vấn dịch vụ miễn phí và tìm ra giải pháp tốt nhất cho nhu cầu của bạn!