基本上,我有一个顶部导航栏(菜单),并希望它在鼠标悬停时扩展.当onHover
属性变成true
时,它应该向下扩展并动画,当onHover
属性变成false
时,它应该向下折叠并动画.
然而,当它展开时,它的高度应该受到其子+填充的大小的限制.I don't want to set a specific height to the container.
作为参考,这是我的代码:
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool isTopBarHovered = false;
void handleTopBarHover(bool isHovered) {
setState(() {
isTopBarHovered = isHovered;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MediaQuery.of(context).size.width < 800
? AppBar()
: PreferredSize(
preferredSize: Size(MediaQuery.of(context).size.width, 48.0),
child: TopNavigationBar(onHover: handleTopBarHover),
),
body: Stack(
children: [
Container(),
Positioned(
top: 0,
left: 0,
right: 0,
child: AnimatedSize(
duration: const Duration(milliseconds: 250),
curve: Curves.easeInOut,
child: isTopBarHovered
? Container(
color: Colors.black,
child: const Padding(
padding: EdgeInsets.symmetric(vertical: 88.0),
child: Center(
child: Text('Additional Widget'),
),
),
)
: const SizedBox(height: 0),
),
),
],
),
);
}
}
class TopNavigationBar extends StatefulWidget {
final Function(bool) onHover;
const TopNavigationBar({super.key, required this.onHover});
@override
State<TopNavigationBar> createState() => _TopNavigationBarState();
}
class _TopNavigationBarState extends State<TopNavigationBar> {
@override
Widget build(BuildContext context) {
bool isHover = false;
return Container(
color: Colors.black,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
InkWell(
onTap:(){},
onHover: (val) {
setState(() {
isHover = val;
});
widget.onHover(isHover);
},
child: const Padding(
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0),
child: Text(
"Item 01",
style: TextStyle(color: Colors.white),
),
),
),
],
),
);
}
}
这部分有效,我只能在扩展时让它充满活力,当它折叠时,它就会消失而没有动画.