前言
這一篇,我們繼續說實際開發中會用到的一些功能。
啟動頁
Android
啟動頁
在 android/app/src/main/res/drawable/launch_background.xml
中已經有寫好的啟動頁,只需修改即可
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>
複製程式碼
如果有更進一步的需求,比如說要在啟動頁載入廣告圖,並延時幾秒的功能,就需要自己實現了。
思路如下
在main方法中返回自己定義的SplashWidgit
(名字隨便起),在其中處理自己的邏輯,包括載入廣告圖、設定延時等,延時結束後,跳轉至真正的主頁即可。
狀態列
- 狀態列顏色
1.使用MaterialApp
的theme
屬性,theme: ThemeData(primaryColor: Colors.green)
, 請注意:這個是全域性的
AppBar
的backgroundColor
屬性,backgroundColor: Colors.deepOrange
3.不使用AppBar
,由於Flutter
預設是從螢幕最頂部開始佈局,所以,修改狀態列顏色簡直太容易,只需要通過MediaQueryData.fromWindow(WidgetsBinding.instance.window).padding.top
取得狀態列高度即可。
Container(
color: Colors.white,
child: Column(
children: <Widget>[
Container(
//狀態列高度
height: MediaQueryData.fromWindow(WidgetsBinding.instance.window)
.padding
.top,
color: Colors.blue,
),
Container(
height: 200,
color: Colors.brown,
),
],
),
);
複製程式碼
甚至你可以修改為漸變色,修改Container
的decoration
屬性
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.cyan, Colors.brown, Colors.deepOrange],
)),
複製程式碼
- 字型顏色
使用AppBar
的brightness
屬性:Brightness.light
為黑色,Brightness.dark
為白色;
不使用AppBar
時,可以通過巢狀AnnotatedRegion<SystemUiOverlayStyle>
來實現。
class StatusDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
child: AnnotatedRegion<SystemUiOverlayStyle>(
child: Column(
children: <Widget>[
Container(
height: 200,
color: Colors.brown,
),
],
),
value: SystemUiOverlayStyle(
statusBarColor: Colors.cyan,
//有Appbar時,會被覆蓋
statusBarIconBrightness: Brightness.light,
//底部navigationBar背景顏色
systemNavigationBarColor: Colors.white),
),
);
}
}
複製程式碼
- 漸變色
使用AppBar
的flexibleSpace
,其中漸變方式還可選擇RadialGradient
和SweepGradient
appBar: AppBar(
title: Text('DemoPage'),
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.cyan, Colors.brown, Colors.deepOrange],
)),
),
)
複製程式碼
返回鍵監聽
可以WillPopScope
巢狀,可以用於監聽處理返回鍵的邏輯。其實WillPopScope
並不是監聽返回按鍵,是當前頁面將要被pop
時觸發的回撥。
class _StatusDemoState extends State<StatusDemo> {
@override
Widget build(BuildContext context) {
return WillPopScope(
child: StatusWidget(),
onWillPop: () {
///如果返回 return new Future.value(false); popped 就不會被處理
///如果返回 return new Future.value(true); popped 就會觸發
///這裡可以通過 showDialog 彈出確定框,在返回時通過 Navigator.of(context).pop(true);決定是否退出
return showExitDialog(context);
},
);
}
Future<bool> showExitDialog(BuildContext context) {
return showDialog(
context: context,
builder: (BuildContext content) {
return AlertDialog(
title: Text("提示"),
content: Text("確認退出嗎?"),
actions: <Widget>[
GestureDetector(
child: Container(
child: Text('退出'),
),
onTap: () {
Navigator.of(context).pop(true);
},
),
GestureDetector(
child: Container(
child: Text('取消'),
),
onTap: () {
Navigator.of(context).pop();
},
),
],
);
});
}
}
複製程式碼
選取圖片
使用的是Flutter
提供的image_picker
首先,在pubspec.yaml檔案中新增依賴image_picker: '0.6.0+8'
class TakeDemo extends StatefulWidget {
@override
_TakeDemoState createState() => _TakeDemoState();
}
class _TakeDemoState extends State<TakeDemo> {
File _image;
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: EdgeInsets.only(top: 20),
alignment: AlignmentDirectional.center,
child: Column(
children: <Widget>[
FlatButton(
onPressed: () {
getImage();
},
child: Text('從相簿選擇'),
),
Center(
child: _image == null
? Text('No image selected.',style: TextStyle(fontSize: 14),)
: Image.file(_image),
),
],
),
);
}
Future getImage() async {
//gallery相簿,camera拍照
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_image = image;
});
}
}
複製程式碼