發(fā)表日期:2019-01 文章編輯:小燈 瀏覽次數(shù):2731
設計給的效果如下:
拿到設計后,先把整體拆分成幾個部分:
然后就可以開始進行編碼了。
先把需要引用的自定義組件一次引入,carousel_with_indicator.dart
、login_form.dart
和user_agreement.dart
文件,它們分別對應《Flutter布局錦囊---輪播圖片與滑塊》、《Flutter布局錦囊---蠟筆畫的表單》和《Flutter布局錦囊---用戶協(xié)議聲明》。
import 'package:flutter/material.dart'; import 'widgets/carousel_with_indicator.dart'; import 'widgets/login_form.dart'; import 'widgets/user_agreement.dart';/// 登錄頁面組件。 class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); }
實現(xiàn)“運營位”的UI很簡單,因為在《Flutter布局錦囊---輪播圖片與滑塊》中,已經完成了具體的實現(xiàn),你只需要調用CarouselWithIndicator
組件就可以了。
/// 與登錄頁面組件關聯(lián)的狀態(tài)子類。 class _LoginPageState extends State<LoginPage> { @override Widget build(BuildContext context) { // TODO: 第4步:實現(xiàn)“用戶協(xié)議”,實現(xiàn)“相對下方”布局。// 腳手架(`Scaffold`)組件,實現(xiàn)基本Material設計視覺布局結構。 return Scaffold( body: SafeArea( child: ListView( children: <Widget>[ CarouselWithIndicator(), // TODO: 第3步:實現(xiàn)“登錄表單”。 // TODO: 第4步:實現(xiàn)“用戶協(xié)議”。 ], ), ), ); } }
同上,實現(xiàn)“登錄表單”也只需要調用LoginForm
組件即可,具體實現(xiàn)在《Flutter布局錦囊---蠟筆畫的表單》中。
// TODO: 第3步:實現(xiàn)“登錄表單”。 LoginForm(),
實現(xiàn)“用戶協(xié)議”的時候比較困難,因為你需要相對于屏幕下方來放置組件。筆者沒有在Flutter文檔中找到能同時實現(xiàn)靈活布局和相對屏幕下方布局的方法,只能采取非常土的方法,先計算出屏幕上剩余的空間。
// TODO: 第4步:實現(xiàn)“用戶協(xié)議”,實現(xiàn)“相對下方”布局。 /// 屏幕下方的剩余高度。 double screenHeight;// 媒體查詢(`MediaQuery`)類,建立媒體查詢解析給定數(shù)據的子樹,返回媒體查詢數(shù)據(`MediaQueryData`)類。 // 媒體查詢數(shù)據(`MediaQueryData`)類的方向(`orientation`)屬性,媒體的方向,即設備是處于橫向還是縱向模式。 if (MediaQuery.of(context).orientation == Orientation.portrait) { // 媒體查詢數(shù)據(`MediaQueryData`)類的大?。╜size`)屬性,邏輯像素中的媒體大小,即屏幕的大小。 // 媒體查詢數(shù)據(`MediaQueryData`)類的填充(`padding`)屬性,應用程序可以呈現(xiàn)的顯示矩形每一側的物理像素數(shù)。 // 填充(`padding`)屬性的頂部(`top`)值是狀態(tài)欄高度,底部(`bottom`)值是系統(tǒng)操作欄高度。 screenHeight = MediaQuery.of(context).size.height - MediaQuery.of(context).padding.top -MediaQuery.of(context).padding.bottom - 536; } else { // 橫屏時的高度,用于避免因為切換橫豎屏導致的異常顯示。 screenHeight = 82.0; }
然后用大小框(SizedBox
)組件來占據屏幕剩余的空間,再通過垂直(Column
)組件的主軸對齊(mainAxisAlignment
)屬性把UserAgreement
組件布局于屏幕下方。
// TODO: 第4步:實現(xiàn)“用戶協(xié)議”。 // 通過大小框(`SizedBox`)組件來利用屏幕剩余的空間,實現(xiàn)從屏幕下方布局。 SizedBox( height: screenHeight, child: Align( alignment: Alignment.bottomCenter, child: Column( // 垂直(`Column`)組件的主軸對齊(`mainAxisAlignment`)屬性,如何將子組件放在主軸上。 mainAxisAlignment : MainAxisAlignment.end, children: <Widget>[ UserAgreement(), SizedBox(height: 20.0), ], ), ), ),