Flutter CupertinoNavigationBar


简介

ios 风格的 导航栏

  • 构成 toolbar 的最基本 widget,常规页面的 title,在 toolbar 居中显示;
  • 当居中显示时,它支持通过设置 leading 和 trailing 属性对应的 widget,来决定是在中间 widget 前面还是后面显示;
  • leading widget 将自动的成为一个返回 chevron icon button(或全屏对话框的关闭按钮),如果没有提供,则弹出当前路由,并且automaticallyImplyLeading为true(默认为true);
  • 如果没有提供,并且 automaticallyImplyIdle 为true,则中间的 widget 将自动成为当前 CupertinoPageRoute 中的 title。
  • 它应该被放在屏幕的顶部,并自动占据操作系统的状态栏。
  • 如果给定 backgroundColor 的不透明度不是1.0(默认情况下为1.0),它将对其后面的内容产生模糊效果。
  • 当路 transitionBetweenRoutes 为 true,如果被切换的路由还拥有一个 CupertinaVigationBar 或一个 CupertinoSiverNavigationBar,并且 transitionBetweenRoutes 设置为 true,则此导航栏将在路由顶部而不是在路由内部进行切换。
  • 如果 transitionBetweenRoutes 为 true,则任何 widget 的参数,都不能在其子树中包含 key,因为该 widget 将同时存在于树中的多个位置。
  • 默认情况下,每个页面路由中只应存在一个 CupertinaVigationBar 或 CupertinoSiverNavigationBar,以支持默认切换。
  • 使用 transitionBetweenRoutes 或 Herotag 可自定义每个路由的多个导航栏的切换行为。

基本用法

CupertinoNavigationBar 的一个示例

  • 通常被 CupertinoPageScaffold 包裹

实例演示

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

/*
* CupertinoNavigationBar 默认的实例
* */
class CupertinoNavigationBarFullDefault extends StatefulWidget {
  const CupertinoNavigationBarFullDefault() : super();

  @override
  State<StatefulWidget> createState() => _CupertinoNavigationBarFullDefault();
}

/*
* CupertinoNavigationBar 默认的实例,有状态
* */
class _CupertinoNavigationBarFullDefault extends State {

  Widget build2(BuildContext context) {
    return SizedBox(
      height: MediaQuery.of(context).size.height,
      width: MediaQuery.of(context).size.width,
      //height: 500.0,
      child:CupertinoApp(
      home: CupertinoTabScaffold(
        tabBar: CupertinoTabBar(
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.share),
              title: Text('Tab 1'),
            ),
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.share),
              title: Text('Tab 2'),
            ),
          ],
        ),
        tabBuilder: (BuildContext context, int index) {
          // For 1-indexed readability.
          ++index;
          return CupertinoTabView(
            builder: (BuildContext context) {
              return CupertinoPageScaffold(
                navigationBar: CupertinoNavigationBar(
                  middle: Text('Page 1 of tab $index'),
                ),
                child: Center(
                  child: CupertinoButton(
                    child: const Text('Next'),
                    onPressed: () {
                      Navigator.of(context).push(
                        CupertinoPageRoute<void>(
                          builder: (BuildContext context) {
                            return CupertinoPageScaffold(
                              navigationBar: CupertinoNavigationBar(
                                middle: Text('Page 2 of tab $index'),
                              ),
                              child: Center(
                                child: CupertinoButton(
                                  child: const Text('Back'),
                                  onPressed: () {
                                    Navigator.of(context).pop();
                                  },
                                ),
                              ),
                            );
                          },
                        ),
                      );
                    },
                  ),
                ),
              );
            },
          );
        },
      ),
     )
    );
  }

  Widget build(BuildContext context) {
    return SizedBox(
        height: MediaQuery.of(context).size.height/1.5,
        child: navigationBar(context)
    );
  }

  Widget navigationBar(BuildContext context) {
    return CupertinoPageScaffold( // 进入程序后显示的第一个页面,传入的是一个Widget,但实际上这个Widget需要包裹一个Scaffold
      navigationBar: CupertinoNavigationBar(
        leading: Icon(CupertinoIcons.back),// 放置在导航栏的开头。通常是正常页面的后退按钮或完整页面对话框的取消按钮
        middle: Text('Title'),// 放置在导航栏的中间。通常是标题或分段控件
        trailing: Icon(CupertinoIcons.share),// 放置在导航栏的末尾。通常在页面上执行其他操作,例如搜索或编辑功能
        actionsForegroundColor:CupertinoColors.white,// 用于 导航栏中前导和尾随小部件的文本和图标的默认颜色。
        backgroundColor:CupertinoColors.activeGreen,// 导航栏的背景颜色。如果它包含透明度,标签栏将自动对其背后的内容产生模糊效果
        border:Border( // 边框样式
          bottom: BorderSide(color: CupertinoColors.inactiveGray, width: 1.0),
        ),
        //heroTag :null,
        previousPageTitle:'???',// 自动隐含前导按钮时手动指定上一个路线的标题
        transitionBetweenRoutes:true // 是否在导航栏之间转换
      ),
      child: Center(
          child: Text('这里是内容', style: TextStyle(color: Colors.black))
      ), // 应用程序默认路由,(Navigator.defaultRouteName,即/)
    );
  }

  Widget tabBar(BuildContext context){
    return CupertinoTabBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.home),
            title: Text('Home'),
          ),
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.conversation_bubble),
            title: Text('Support'),
          ),
          BottomNavigationBarItem(
            icon: Icon(CupertinoIcons.profile_circled),
            title: Text('Profile'),
          ),
        ]
    );
  }
}