Flutter中BottomAppBar不显示问题求助
Flutter BottomAppBar 不显示问题解决
跟着教程开发时,重新加载模拟器后BottomAppBar未显示,且无任何报错信息。模拟器运行效果如下:
我的代码
main.dart
import 'package:flutter/material.dart'; import 'package:secondlife_mobile/screens/home.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Perspective PageView', theme: ThemeData( useMaterial3: true, ), home: const MyHomePage(), ); } } class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: BottomAppBar( child: Row( children: [ IconButton(onPressed: () {}, icon: const Icon(Icons.home)), IconButton(onPressed: () {}, icon: const Icon(Icons.home)), ], ), ), ); } }
home.dart
import 'package:flutter/material.dart'; import 'package:secondlife_mobile/PageViewHolder.dart'; import 'package:provider/provider.dart'; class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final PageStorageBucket bucket = PageStorageBucket(); late PageViewHolder holder; late PageController _controller; double fraction = 0.57; // 通过该比例,设置PageView在显示当前页时,同时展示前后页面各50%的区域 @override void initState() { super.initState(); holder = PageViewHolder(value: 2.0); _controller = PageController(initialPage: 2, viewportFraction: fraction); _controller.addListener(() { holder.setValue(_controller.page); }); } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( appBar: AppBar( centerTitle: true, title: const Text('AppBar'), leading: IconButton( onPressed: () {}, icon: const Icon(Icons.search_outlined), ), actions: [ IconButton( onPressed: () {}, icon: const Icon(Icons.more_vert), ), ], ), body: SingleChildScrollView( child: SizedBox( height: MediaQuery.of(context).size.height, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox( height: 92.5, ), const Padding( padding: EdgeInsets.symmetric(horizontal: 35), child: Text( 'Playlist for you', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w400, ), ), ), const SizedBox(height: 35), Container( child: Center( child: AspectRatio( aspectRatio: 1, child: ChangeNotifierProvider<PageViewHolder>.value( value: holder, child: PageView.builder( controller: _controller, itemCount: 4, physics: const BouncingScrollPhysics(), itemBuilder: (context, index) { return MyPage( number: index.toDouble(), fraction: fraction, ); }), ), ), ), ), const SizedBox(height: 2.0), ////本周播放列表文本 const Padding( padding: EdgeInsets.symmetric(horizontal: 35), child: Text( 'Playlist of the week', style: TextStyle( fontSize: 17, fontWeight: FontWeight.w600, ), ), ), ], ), ), ), ), ); } } class MyPage extends StatelessWidget { final number; final double? fraction; const MyPage({super.key, this.number, this.fraction}); @override Widget build(BuildContext context) { double? value = Provider.of<PageViewHolder>(context).value; double diff = (number - value); // diff为负数 = 左侧页面 // diff为0 = 当前页面 // diff为正数 = 右侧页面 //元素矩阵 final Matrix4 pvMatrix = Matrix4.identity() ..setEntry(3, 2, 1 / 0.9) //将缩放比例提高90% ..setEntry(1, 1, fraction!) //沿Y轴修改缩放比例 ..setEntry(3, 0, 0.004 * -diff); //沿X轴修改透视效果 //阴影矩阵 final Matrix4 shadowMatrix = Matrix4.identity() ..setEntry(3, 3, 1 / 1.6) //将缩放比例提高60% ..setEntry(3, 1, -0.004) //沿Y轴修改缩放比例 ..setEntry(3, 0, 0.002 * diff) //沿X轴修改透视效果 ..rotateX(1.309); //沿X轴旋转阴影 return Stack( fit: StackFit.expand, alignment: FractionalOffset.center, children: [ Transform.translate( offset: const Offset(0.0, -47.5), child: Transform( transform: pvMatrix, alignment: FractionalOffset.center, child: Container( decoration: BoxDecoration(boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.5), blurRadius: 11.0, spreadRadius: 4.0, offset: const Offset( 13.0, 35.0), //阴影方向:右下 ) ]), child: Image.asset( "assets/images/image_${number.toInt() + 1}.jpg", fit: BoxFit.fill), ), ), ), ], ); } }
问题原因
你的代码里存在两个首页组件:main.dart中的HomePage(配置了BottomAppBar)和home.dart中的MyHomePage(被MyApp指定为实际首页)。但**MyHomePage的Scaffold并没有配置bottomNavigationBar**,而HomePage完全没被使用,这就是BottomAppBar不显示的核心原因。
解决方案
将BottomAppBar添加到home.dart中MyHomePage的Scaffold里,修改后的build方法代码如下:
@override Widget build(BuildContext context) { return SafeArea( child: Scaffold( appBar: AppBar( centerTitle: true, title: const Text('AppBar'), leading: IconButton( onPressed: () {}, icon: const Icon(Icons.search_outlined), ), actions: [ IconButton( onPressed: () {}, icon: const Icon(Icons.more_vert), ), ], ), // 新增BottomAppBar配置 bottomNavigationBar: BottomAppBar( child: Row( children: [ IconButton(onPressed: () {}, icon: const Icon(Icons.home)), IconButton(onPressed: () {}, icon: const Icon(Icons.home)), ], ), ), body: SingleChildScrollView( child: SizedBox( height: MediaQuery.of(context).size.height, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox( height: 92.5, ), const Padding( padding: EdgeInsets.symmetric(horizontal: 35), child: Text( 'Playlist for you', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w400, ), ), ), const SizedBox(height: 35), Container( child: Center( child: AspectRatio( aspectRatio: 1, child: ChangeNotifierProvider<PageViewHolder>.value( value: holder, child: PageView.builder( controller: _controller, itemCount: 4, physics: const BouncingScrollPhysics(), itemBuilder: (context, index) { return MyPage( number: index.toDouble(), fraction: fraction, ); }), ), ), ), ), const SizedBox(height: 2.0), const Padding( padding: EdgeInsets.symmetric(horizontal: 35), child: Text( 'Playlist of the week', style: TextStyle( fontSize: 17, fontWeight: FontWeight.w600, ), ), ), ], ), ), ), ), ); }
内容的提问来源于stack exchange,提问作者loupdaniel
相关产品推荐
相关产品推荐

