發表日期:2019-01 文章編輯:小燈 瀏覽次數:2185
設計給的效果如下:
UI布局圖拿到設計后,先把整體拆分成幾個部分:
然后就可以開始進行編碼了。
首先引入需要的自定義組件,login_form_field.dart
文件是《Flutter布局錦囊---帶彩條的文本字段》中的代碼,login_form_code.dart
文件是《Flutter布局錦囊---驗證碼倒計時》中的代碼,doodle_button.dart
文件是《Flutter布局錦囊---涂鴉風格按鈕》中的代碼。
import 'package:flutter/material.dart'; import 'login_form_field.dart'; import 'login_form_code.dart'; import '../common/doodle_button.dart';/// 自定義的登錄表單組件。 class LoginForm extends StatefulWidget { @override _LoginFormState createState() => _LoginFormState(); }
然后定義一些用來控制文本字段狀態、驗證碼按鈕狀態的成員變量,同時把UI布局的基本輪廓描繪出來。
/// 與自定義的登錄表單組件關聯的狀態子類。 class _LoginFormState extends State<LoginForm> { /// 手機號文本字段的控制器。 final _phoneController = TextEditingController(); /// 驗證碼文本字段的控制器。 final _codeController = TextEditingController(); /// 發送驗證碼按鈕是否可用。 bool _codeAvailable = false; /// 手機號文本字段是否符合格式。 bool _phoneActivation = false; /// 驗證碼文本字段是否符合格式。 bool _codeActivation = false;@override Widget build(BuildContext context) { return Row( children: <Widget>[ Expanded( flex: 1, child: SizedBox(), ), Expanded( flex: 8, child: Column( children: <Widget>[ // TODO: 實現“手機號輸入框”。 // TODO: 第3步:實現“驗證碼輸入框”。 // TODO: 第4步:實現“登錄按鈕”。 ], ), ), Expanded( flex: 1, child: SizedBox(), ), ] ); } }
通過《Flutter布局錦囊---帶彩條的文本字段》中實現的LoginFormField
組件,你可以迅速實現“手機號輸入框”。
// TODO: 實現“手機號輸入框”。 SizedBox(height: 20.0), LoginFormField( hintText: '請輸入手機號', textEditingController: _phoneController, maxLength: 11, minLength: 7, legitimateCallback: () { setState(() { _phoneActivation = true; _codeAvailable = true;}); }, illegalCallback: () { setState(() { _phoneActivation = false; _codeAvailable = false;}); }, ),
通過《Flutter布局錦囊---帶彩條的文本字段》中實現的LoginFormField
組件、《Flutter布局錦囊---驗證碼倒計時》中實現的LoginFormCode
組件,你可以迅速實現“驗證碼輸入框”。
// TODO: 第3步:實現“驗證碼輸入框”。 SizedBox(height: 30.0), Stack( children: <Widget>[ LoginFormField( hintText: '請輸入驗證碼', textEditingController: _codeController, maxLength: 6, minLength: 6, legitimateCallback: () { setState(() { _codeActivation = true; }); }, illegalCallback: () { setState(() { _codeActivation = false; }); }, ), // 對齊(`Align`)組件,用于將其子項與其自身對齊,并根據子級的大小自行調整大小。 Align( // 高度因子(`heightFactor`)屬性,如果為非空值,則將其高度設置為子組件高度乘以此系數。 // 可以更大也可以小于`1.0`,但必須是正數。 heightFactor: 1.7, // 對準(`alignment`)屬性,如何調整子組件。 // 對準(`Alignment`)類的中心右邊(`centerRight`)常量,沿右邊的中心點對準。 alignment: Alignment.centerRight, child: LoginFormCode( countdown: 60, available: _codeAvailable, onTapCallback: () { print(_codeController.text); }, ), ), ], ),
最后,通過《Flutter布局錦囊---涂鴉風格按鈕》中的DoodleButton
組件,迅速實現“登錄按鈕”。
// TODO: 第4步:實現“登錄按鈕”。 SizedBox(height: 48.0), DoodleButton( promptText: '登錄', activation: _codeActivation && _phoneActivation, onTapCallback: (){ print('點擊了“登錄”按鈕'); }, ),
日期:2018-10 瀏覽次數:7256
日期:2018-12 瀏覽次數:4332
日期:2018-07 瀏覽次數:4882
日期:2018-12 瀏覽次數:4178
日期:2018-09 瀏覽次數:5505
日期:2018-12 瀏覽次數:9926
日期:2018-11 瀏覽次數:4809
日期:2018-07 瀏覽次數:4586
日期:2018-05 瀏覽次數:4863
日期:2018-12 瀏覽次數:4329
日期:2018-10 瀏覽次數:5144
日期:2018-12 瀏覽次數:6218
日期:2018-11 瀏覽次數:4471
日期:2018-08 瀏覽次數:4594
日期:2018-11 瀏覽次數:12641
日期:2018-09 瀏覽次數:5585
日期:2018-12 瀏覽次數:4839
日期:2018-10 瀏覽次數:4194
日期:2018-11 瀏覽次數:4533
日期:2018-12 瀏覽次數:6068
日期:2018-06 瀏覽次數:4010
日期:2018-08 瀏覽次數:5441
日期:2018-10 瀏覽次數:4460
日期:2018-12 瀏覽次數:4533
日期:2018-07 瀏覽次數:4364
日期:2018-12 瀏覽次數:4504
日期:2018-06 瀏覽次數:4386
日期:2018-11 瀏覽次數:4377
日期:2018-12 瀏覽次數:4253
日期:2018-12 瀏覽次數:5287
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.