【Flutter】開發之功能篇(七)

歡子發表於2019-05-24

前言

這一篇,我們繼續說實際開發中會用到的一些功能。

啟動頁

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.使用MaterialApptheme屬性,theme: ThemeData(primaryColor: Colors.green)請注意:這個是全域性的

image.png
2.使用AppBarbackgroundColor屬性,backgroundColor: Colors.deepOrange
image.png
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,
          ),
        ],
      ),
    );
複製程式碼

image.png
甚至你可以修改為漸變色,修改Containerdecoration屬性

          decoration: BoxDecoration(
              gradient: LinearGradient(
            colors: [Colors.cyan, Colors.brown, Colors.deepOrange],
          )),
複製程式碼

image.png

  • 字型顏色

使用AppBarbrightness屬性: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),
      ),
    );
  }
}
複製程式碼
  • 漸變色

使用AppBarflexibleSpace,其中漸變方式還可選擇RadialGradientSweepGradient

      appBar: AppBar(
        title: Text('DemoPage'),
        flexibleSpace: Container(
          decoration: BoxDecoration(
              gradient: LinearGradient(
            colors: [Colors.cyan, Colors.brown, Colors.deepOrange],
          )),
        ),
      )
複製程式碼

image.png

返回鍵監聽

可以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;
    });
  }
}
複製程式碼

20190524_114834.gif

你的認可,是我堅持更新部落格的動力,如果覺得有用,就請點個贊,謝謝

相關文章