dart – Flutter – 在BottomNavigationBar中显示PopupMenuButto
发布时间:2020-12-14 14:51:25 所属栏目:百科 来源:网络整理
导读:我想在单击导航栏项目时显示菜单.这是我的尝试: @override Widget build(BuildContext context) { return DefaultTabController( length: 3,child: Scaffold( appBar: MyAppBar( title: "Home",context: context,),bottomNavigationBar: BottomNavigationBa
我想在单击导航栏项目时显示菜单.这是我的尝试:
@override Widget build(BuildContext context) { return DefaultTabController( length: 3,child: Scaffold( appBar: MyAppBar( title: "Home",context: context,),bottomNavigationBar: BottomNavigationBar( items: [ BottomNavigationBarItem( icon: new Icon(Icons.home),title: Text('Home')),BottomNavigationBarItem( icon: new Icon(Icons.book),title: Text('Second')),BottomNavigationBarItem( icon: new PopupMenuButton( icon: Icon(Icons.add),itemBuilder: (_) => <PopupMenuItem<String>>[ new PopupMenuItem<String>( child: const Text('test1'),value: 'test1'),new PopupMenuItem<String>( child: const Text('test2'),value: 'test2'),],title: Text('more')),currentIndex: 0,body: new Container())); } 我遇到了两个问题.第一个是NavigationBarItem的显示.在我无法删除的标题图标之间有一个填充(即使添加填充:EdgeInsets.all(0.0))(如下图所示).第二个是我需要完全点击图标才能显示菜单. 当点击index = 2(例如)的BottomNavigationBarItem时,我尝试直接调用showMenu(PopupMenuButton调用的方法).但是如何确定菜单应该出现的原点的位置是很棘手的. 解决方法
这是一个直接使用showMenu并调用函数buttonMenuPosition来获取菜单位置的尝试.它相当脆弱,但您可以将按钮的位置更改为中间,例如使用bar.size.center而不是bar.size.bottomRight.使用一些MATH并通过手动操作Offset对象(如果/当您有超过3个项目时),您可以更改位置以使菜单位于不是中心或末尾的菜单上.
RelativeRect buttonMenuPosition(BuildContext c) { final RenderBox bar = c.findRenderObject(); final RenderBox overlay = Overlay.of(c).context.findRenderObject(); final RelativeRect position = RelativeRect.fromRect( Rect.fromPoints( bar.localToGlobal(bar.size.bottomRight(Offset.zero),ancestor: overlay),bar.localToGlobal(bar.size.bottomRight(Offset.zero),Offset.zero & overlay.size,); return position; } @override Widget build(BuildContext context) { final key = GlobalKey<State<BottomNavigationBar>>(); return DefaultTabController( length: 3,child: Scaffold( appBar: AppBar( title: Text("Home"),bottomNavigationBar: BottomNavigationBar( key: key,items: [ const BottomNavigationBarItem( icon: Icon(Icons.home),const BottomNavigationBarItem( icon: Icon(Icons.book),const BottomNavigationBarItem( icon: Icon(Icons.add),onTap: (index) async { final position = buttonMenuPosition(key.currentContext); if (index == 2) { final result = await showMenu( context: context,position: position,items: <PopupMenuItem<String>>[ const PopupMenuItem<String>( child: Text('test1'),const PopupMenuItem<String>( child: Text('test2'),); } },body: Container())); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |