Flutter Appbar Widget使用详解
Flutter的AppBar Widget是一个常用的顶部导航栏控件,可以帮助开发者快速实现应用的导航和标题显示。在本文中,我将向你介绍AppBar的常见属性和用法。
基本用法 要使用AppBar Widget,只需在Scaffold Widget中添加它作为参数即可。例如,以下代码展示了如何创建一个带有标题“Flutter App”的AppBar:
Scaffold(
  appBar: AppBar(
    title: Text("Flutter App"),
  ),
  body: Container(
    // 应用程序的主体内容
  ),
);
在这个例子中,我们创建了一个Scaffold Widget,并设置了一个AppBar Widget作为它的顶部导航栏。AppBar的标题通过Text Widget来指定。除此之外,我们还在Scaffold中添加了一个Container Widget作为应用程序的主体内容。
AppBar有许多可用的属性,包括以下几个常见的属性:
- title: AppBar的标题,通常是一个Text Widget。
 - leading: AppBar左侧的小部件,通常是一个IconButton Widget,用于打开侧边栏菜单或返回上一页。
 - actions: AppBar右侧的小部件,通常是一些IconButton Widget,用于执行一些操作,如搜索或设置。
 - backgroundColor: AppBar的背景色。
 - elevation: AppBar的高度,通常是一个双精度浮点数,单位是像素。
 - centerTitle: 是否将标题居中显示,默认值为false。
 
以下是一个使用所有这些属性的例子:
Scaffold(
  appBar: AppBar(
    title: Text("Flutter App"),
    leading: IconButton(
      icon: Icon(Icons.menu),
      onPressed: () {
        // 打开侧边栏菜单的代码
      },
    ),
    actions: [
      IconButton(
        icon: Icon(Icons.search),
        onPressed: () {
          // 执行搜索操作的代码
        },
      ),
      IconButton(
        icon: Icon(Icons.settings),
        onPressed: () {
          // 打开设置页面的代码
        },
      ),
    ],
    backgroundColor: Colors.blue,
    elevation: 4.0,
    centerTitle: true,
  ),
  body: Container(
    // 应用程序的主体内容
  ),
);
自定义AppBar
如果你想要更多的控制权,你可以使用PreferredSize Widget来创建自定义的AppBar。PreferredSize Widget需要一个preferredSize属性,用于指定AppBar的大小。你可以使用SizedBox Widget来设置AppBar的大小。
让我来举一个更具体的自定义AppBar的例子。假设我们要创建一个带有搜索框的AppBar,搜索框可以在用户输入时实时搜索内容。
首先,我们可以创建一个StatefulWidget,名为SearchAppBar。在State类中,我们创建一个TextEditingController,用于控制搜索框的文本输入。
class SearchAppBar extends StatefulWidget implements PreferredSizeWidget {
  final String title;
  final double height;
  SearchAppBar({required this.title, this.height = kToolbarHeight});
  @override
  _SearchAppBarState createState() => _SearchAppBarState();
  @override
  Size get preferredSize => Size.fromHeight(height);
}
class _SearchAppBarState extends State<SearchAppBar> {
  final TextEditingController _searchController = TextEditingController();
  String _searchText = '';
  @override
  void initState() {
    super.initState();
    _searchController.addListener(_onSearchChanged);
  }
  @override
  void dispose() {
    _searchController.removeListener(_onSearchChanged);
    _searchController.dispose();
    super.dispose();
  }
  void _onSearchChanged() {
    setState(() {
      _searchText = _searchController.text;
    });
    // TODO: 执行搜索操作
  }
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Text(widget.title),
      backgroundColor: Colors.blue,
      centerTitle: true,
      actions: [
        IconButton(
          icon: Icon(Icons.search),
          onPressed: () {},
        ),
      ],
      bottom: PreferredSize(
        child: TextField(
          controller: _searchController,
          decoration: InputDecoration(
            hintText: 'Search',
            border: OutlineInputBorder(),
          ),
        ),
        preferredSize: Size.fromHeight(50.0),
      ),
    );
  }
}
在build方法中,我们返回一个AppBar Widget,设置了各种属性。为了添加搜索框,我们使用了PreferredSize Widget,并将其放在AppBar的底部。搜索框是一个TextField Widget,我们将其放在PreferredSize的child属性中,并指定其preferredSize为Size.fromHeight(50.0)。
当用户输入搜索框时,我们需要执行搜索操作。为此,我们使用了TextEditingController来监听搜索框的文本变化,并在_onSearchChanged方法中更新_searchText变量的值。我们还在dispose方法中移除了_listener,以避免内存泄漏。
现在,我们可以在Scaffold中使用SearchAppBar了:
Scaffold(
  appBar: SearchAppBar(title: 'My App'),
  body: Container(
    // 应用程序的主体内容
  ),
);
这样,我们就创建了一个带有搜索框的AppBar,并可以在用户输入搜索框时实时搜索内容了。