BottomAppBar là gì?

    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 

    appbar

    Cấu trúc của BottomAppBar

    const BottomAppBar(
        {Key key,
        Color color,
        double elevation,
        NotchedShape shape,
        Clip clipBehavior: Clip.none,
        double notchMargin: 4.0,
        Widget child}
    )
    

    Child property

    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 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 :

    thuộc tính child

    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 :

    appbar

    Để 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 :

    appbar

    Shape property

    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(),
            )
        );
      }
    }
    

    appbar

    Color property

    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 :

    appbar

    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