BottomAppBar thuộc widget Scaffold nằm ở phía cuối của Scaffold và được cố định cuối màn hình, nó thường được dùng chứa các chức năng nổi bật của ứng dụng và cho phép người dùng dễ dàng truy cập đến các chức năng này
BottomAppBar cho phép gắn với một FloatingActionButton
const BottomAppBar( {Key key, Color color, double elevation, NotchedShape shape, Clip clipBehavior: Clip.none, double notchMargin: 4.0, Widget child} )
child là một thuộc tính quan trọng hầu như được sử dụng trong mọi BottomAppBar, child có thể là một Row dùng để chứa nhiều Widget con như IconButton, PopupMenuButton,..
Dưới đây là một ví dụ khai báo một BottomAppBar với các Widget IconButton và PopupMenuButton
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), bottomNavigationBar: BottomAppBar( child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ), ) ); } }
Kết quả hiển thị như sau :
Doạn code dưới đây sẽ thêm một FloatingActionButton vào khu vực BottomAppBar
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), floatingActionButton: FloatingActionButton.extended ( elevation: 4.0, icon: const Icon(Icons.add), label: const Text('Thêm nhiệm vụ'), onPressed: () {}, ), floatingActionButtonLocation: FloatingActionButtonLocation.endDocked, bottomNavigationBar: BottomAppBar( child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ), ) ); } }
Sau khi thêm nút FloatingActionButton và khởi động ứng dụng sẽ có kết quả như sau :
Để neo đối tượng FloatingActionButton vào giữa của BottonAppBar bạn sẽ sử dụng cậu lệnh
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), floatingActionButton: FloatingActionButton( onPressed: () { }, tooltip: 'Increment', child: Icon(Icons.add), elevation: 2.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ), ) ); } }
Để điều chỉnh chiều cao của BottomAppBar bạn sử dụng Widget Container bên ngoài Row như ví dụ sau :
height: 90.0,
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), floatingActionButton: FloatingActionButton( onPressed: () { }, tooltip: 'Increment', child: Icon(Icons.add), elevation: 2.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( child: Container( height: 90.0, child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton(icon: Icon(Icons.menu), onPressed: () {},), IconButton(icon: Icon(Icons.settings), onPressed: () {},), IconButton(icon: Icon(Icons.search), onPressed: () {},), ], ), ) /*child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ),*/ ) ); } }
Kết quả ứng dụng như sau :
Sử dụng thuộc tính shape để định dạng vết khắc (notch) khi FloatingActionButton được đặt trên nền của BottomAppBar, chúng tạo ra những đường cong hiệu ứng xung quanh FloatingActionButton
shape: CircularNotchedRectangle(),
Ví dụ đoạn mã đầy đủ về thuộc tính shape
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), floatingActionButton: FloatingActionButton( onPressed: () { }, tooltip: 'Increment', child: Icon(Icons.add), elevation: 2.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ), shape: CircularNotchedRectangle(), ) ); } }
Thuộc tính color dùng để thay đổi màu nền của BottomAppBar
color: Colors.greenAccent
Ví dụ dưới đây sẽ gán màu nền của BottomAppBar màu xanh lá cây :
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: AppBar( title: Text("VTS BottomAppBar Example"), ), body: Center( child: Text( 'VTSoft nhận đào tạo lập trình Flutter từ A-Z, tuyển dụng sau tốt nghiệp', ) ), floatingActionButton: FloatingActionButton( onPressed: () { }, tooltip: 'Increment', child: Icon(Icons.add), elevation: 2.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( child: new Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton(icon: Icon(Icons.home), onPressed: () {},), PopupMenuButton( icon: Icon(Icons.share), itemBuilder: (context) => [ PopupMenuItem( value: 1, child: Text("Facebook"), ), PopupMenuItem( value: 2, child: Text("Instagram"), ), ], ), IconButton(icon: Icon(Icons.email), onPressed: () {},), ], ), shape: CircularNotchedRectangle(), color: Colors.greenAccent ) ); } }
Sau khi chạy ứng dụng sẽ nhận được kết quả màu nền như hình dưới đây :
Trên đây là bài viết về cách sử dụng BottomAppBar, hy vọng bài viết này đã cung cấp thông tin hữu ích cho các bạn, các bạn có thông tin thắc mắc xin vui lòng liên hệ 098 333 0380 chúng tôi sẵn sàng giải đáp mọi thắc mắc
Bài trước: Hướng dẫn chi tiết cách sử dụng AppBar trong Flutter
Bài tiếp theo: Ứng dụng Flutter đầu tiên “Hello Word”
11/11/2022
28/10/2022
27/10/2022
25/10/2022
24/10/2022
22/08/2021
30/08/2021
14/10/2022
19/08/2021
22/08/2024
15/08/2024
08/08/2024
06/08/2024
01/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!