Flutter多页面共用AppBar:按需控制actions中IconButton的显示
解决方案
要实现按需控制这个播放暂停按钮的显示/隐藏,只需要给你的MyAppBar加一个控制参数,然后根据参数决定是否渲染这个按钮就行,完全不用把按钮代码移到页面里。具体步骤如下:
1. 给MyAppBar添加控制参数
在MyAppBar的构造函数里新增一个布尔类型的参数,用来控制按钮是否显示,默认设为true(这样大部分页面不用改就能正常显示按钮):
class MyAppBar extends StatefulWidget { // 新增控制参数,默认显示按钮 final bool showAudioButton; const MyAppBar({super.key, this.showAudioButton = true}); @override State<MyAppBar> createState() => _MyAppBarState(); }
2. 根据参数动态生成actions
在build方法里,根据widget.showAudioButton的值来决定actions数组里是否包含那个播放暂停按钮:
@override Widget build(BuildContext context) { return AppBar( backgroundColor: Colors.transparent, toolbarHeight: 100, centerTitle: true, iconTheme: const IconThemeData(color: Colors.black), flexibleSpace: const Image( image: AssetImage('assets/images/backgroundappbar.png'), fit: BoxFit.cover, ), title: Center( child: IconButton( onPressed: () { Navigator.pushNamed(context, '/homepage'); }, icon: Image.asset('assets/images/ha_logo.png', height: 80, width: 80,)), ), // 这里根据参数判断是否添加按钮 actions: widget.showAudioButton ? [ IconButton( onPressed: _iconTapped, icon: AnimatedIcon( icon: AnimatedIcons.play_pause, progress: _animationController, ), ), ] : [], // 不显示的话传空数组 ); }
3. 页面中使用方式
- 需要显示按钮的页面(默认情况):直接用
const MyAppBar() - 需要隐藏按钮的页面:传入
showAudioButton: false,比如:
Scaffold( appBar: const MyAppBar(showAudioButton: false), body: ..., )
额外优化(可选)
如果需要在按钮从显示变隐藏时自动暂停音频,可以在_MyAppBarState里重写didUpdateWidget方法:
@override void didUpdateWidget(covariant MyAppBar oldWidget) { super.didUpdateWidget(oldWidget); // 如果之前显示按钮,现在隐藏了,就暂停音频并重置动画 if (oldWidget.showAudioButton && !widget.showAudioButton) { if (videoPlaying) { pauseSound(); _animationController.reverse(); videoPlaying = false; } } }
这样就能完美实现你的需求:所有按钮逻辑都留在MyAppBar文件里,页面只需要传一个参数就能控制显示隐藏。
内容的提问来源于stack exchange,提问作者Eden
相关产品推荐
相关产品推荐

