源码连接:
github.com/hanlin19900…
在初版本的时候, 只是为了实现按钮凸起的效果,忽略了界面主体部分和底部导航栏之间的间距, 致使出现底部导航栏与界面主体部分有部分空白, 问题已经修改,效果图如上, 修改代码见文章底部
import 'package:flutter/material.dart';
import 'pages/MainPage.dart';
void main() => runApp(LightLanguageClient());
class LightLanguageClient extends StatelessWidget{
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Demo',
theme: ThemeData(
primarySwatch: Colors.blue
),
home: MainPage(),
);
}
}
复制代码
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return _HomePageState();
}
}
class _HomePageState extends State<HomePage>{
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Text('这是首页'),
),
),
);
}
}
复制代码
这个三个页面的代码都同样就没有都贴出来android
import 'package:flutter/material.dart';
import 'HomePage.dart';
import 'AssistantPage.dart';
import 'MinePage.dart';
class MainPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MainPage();
}
}
class _MainPage extends State<MainPage> with SingleTickerProviderStateMixin {
PageController pageController;
int page = 0;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: new PageView(
children: <Widget>[HomePage(), AssistantPage(), MinePage()],
controller: pageController,
onPageChanged: onPageChanged,
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('首页')),
BottomNavigationBarItem(icon: Icon(Icons.assessment), title: Text('助手')),
BottomNavigationBarItem(icon: Icon(Icons.person), title: Text('个人')),
],
onTap: onTap,
currentIndex: page,
),
));
}
@override
void initState() {
super.initState();
pageController = PageController(initialPage: this.page);
}
@override
void dispose() {
pageController.dispose();
super.dispose();
}
void onTap(int index) {
pageController.animateToPage(index,
duration: const Duration(milliseconds: 300), curve: Curves.ease);
}
void onPageChanged(int page) {
setState(() {
this.page = page;
});
}
}
复制代码
class _MainPage extends State<MainPage> with SingleTickerProviderStateMixin {
PageController pageController;
int page = 0;
//添加图片地址,须要动态更换图片
String bigImg = 'images/home_green.png';
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: new PageView(
children: <Widget>[HomePage(), AssistantPage(), MinePage()],
controller: pageController,
onPageChanged: onPageChanged,
),
//重构bottomNavigationBar
bottomNavigationBar: Stack(
children: <Widget>[
Align(
alignment: Alignment.bottomCenter,
child: BottomNavigationBar(
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('首页')),
BottomNavigationBarItem(icon: Icon(Icons.assessment), title: Text('')),
BottomNavigationBarItem(icon: Icon(Icons.person), title: Text('个人')),
],
onTap: onTap,
currentIndex: page,
),
),
Align(
alignment: Alignment.bottomCenter,
child: InkWell(
child: new Image.asset(bigImg,width: 80.0,height: 80.0,),
onTap:onBigImgTap,
),
)
],
)
));
}
@override
void initState() {
super.initState();
pageController = PageController(initialPage: this.page);
}
@override
void dispose() {
pageController.dispose();
super.dispose();
}
//修改bottomNavigationBar的点击事件
void onTap(int index) {
if (index != 1) {
setState(() {
this.bigImg = 'images/home_green.png';
});
}
pageController.animateToPage(index,
duration: const Duration(milliseconds: 300), curve: Curves.ease);
}
//添加图片的点击事件
void onBigImgTap() {
setState(() {
this.page = 1;
this.bigImg = 'images/icon_home.png';
onTap(1);
});
}
void onPageChanged(int page) {
setState(() {
this.page = page;
});
}
}
复制代码
重构完成以后,效果图以下,咱们发现这并非咱们想要的,底部导航栏咱们是实现了,可是PageView被遮盖了git
bottomNavigationBar: Container(
height: 100.0,
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.bottomCenter,
child: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home), title: Text('首页')),
BottomNavigationBarItem(
icon: Icon(Icons.accessibility_new), title: Text('')),
BottomNavigationBarItem(
icon: Icon(Icons.person), title: Text('个人')),
],
onTap: onTap,
currentIndex: page,
),
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: InkWell(
child: new Image.asset(
bigImg,
width: 80.0,
height: 80.0,
),
onTap: onBigImgTap,
),
)),
],
),
)
复制代码
physics: NeverScrollableScrollPhysics(),
复制代码
解决方案很简单,Android原生的白屏问题能够经过为 Launcher Activity 设置 windowBackground 解决,而 Flutter 也是基于此办法,同时优化了 Flutter 初始化阶段的白屏问题(覆盖一个launchView),只用两步设置便能解决 Flutter 中白屏问题。github
在项目的 android/app/src/main/res/mipmap-xhdpi/ 目录下添加闪屏图片;bash
打开 android/app/src/main/res/drawable/launch_background.xml 文件,这个文件就是闪屏的背景文件,具体如何设置能够查阅 Android Drawable,我在 demo 中的设置以下:app
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/background_dark" />
<!-- You can insert your own image assets here -->
<item
android:bottom="84dp">
<bitmap
android:src="@mipmap/launch_image" />
</item>
</layer-list>
复制代码
源码连接:less
刚开始接触Flutter,代码写的有些混乱,可能有些问题考虑不是很深刻,有不足之处,还请各位大佬指出布局
感谢GitHub上大佬提出的问题, 解决办法以下
//Stack里面包裹两个组件: Scaffold 和 FloatingActionButtonhome: Stack(
children: <Widget>[
//Scaffold里面按照以前的写法body->PageView,bottomNavigationBar直接使用BottomNavigationBar
Scaffold(
body: PageView(
physics: NeverScrollableScrollPhysics(),
children: <Widget>[
new HomePage(),
new AssistantPage(),
new MinePage()
],
controller: pageController,
onPageChanged: onPageChanged,
),
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home), title: Text('首页')),
BottomNavigationBarItem(
icon: Icon(Icons.assessment), title: Text('发布')),
BottomNavigationBarItem(
icon: Icon(Icons.person), title: Text('个人')),
],
onTap: onTap,
currentIndex: page,
),
),
//在整个界面的上层放一个FloatingActionButton 组件,位置在底部居中
Align(
child: Padding(
padding: const EdgeInsets.only(bottom: 30.0),
child: FloatingActionButton(
child: new Image.asset(bigImg),
onPressed: onBigImgTap,
),
),
alignment: Alignment.bottomCenter,
),
],
)复制代码