flutter架 构项目基础
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
/// ============================================================
|
||||
/// TextField 输入框演示页(登录表单)
|
||||
///
|
||||
/// 一、两种使用方式:
|
||||
/// 1. 直接运行本页面:runApp(const MaterialApp(home: InputDemoPage()))
|
||||
/// 2. 复制 body 核心代码到任意 Scaffold 的 body 中。
|
||||
///
|
||||
/// 二、核心知识点:
|
||||
/// 1. TextEditingController 管理输入框内容,读取用 controller.text;
|
||||
/// 2. 控制器必须在 dispose() 里释放,否则内存泄漏;
|
||||
/// 3. obscureText 控制密码明文/密文(配合 setState 做"眼睛"切换);
|
||||
/// 4. 注意:Scaffold 没有 padding 参数!外层间距要用 body 里的 Padding。
|
||||
/// ============================================================
|
||||
class InputDemoPage extends StatefulWidget {
|
||||
const InputDemoPage({super.key});
|
||||
|
||||
@override
|
||||
State<InputDemoPage> createState() => _InputDemoPageState();
|
||||
}
|
||||
|
||||
class _InputDemoPageState extends State<InputDemoPage> {
|
||||
// 控制器:负责管理输入框内容
|
||||
final TextEditingController _userCtrl = TextEditingController();
|
||||
final TextEditingController _pwdCtrl = TextEditingController();
|
||||
// 密码是否明文显示(默认密文)
|
||||
bool _showPwd = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// 释放控制器,防止内存泄漏
|
||||
_userCtrl.dispose();
|
||||
_pwdCtrl.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('TextField 登录表单 Demo')),
|
||||
body: Padding(
|
||||
// Scaffold 没有 padding 参数,间距写在 body 的 Padding 上
|
||||
padding: EdgeInsets.all(20.w),
|
||||
child: Column(
|
||||
children: [
|
||||
TextField(
|
||||
controller: _userCtrl,
|
||||
keyboardType: TextInputType.phone, // 弹数字键盘
|
||||
decoration: const InputDecoration(
|
||||
labelText: "手机号",
|
||||
hintText: "请输入11位手机号",
|
||||
prefixIcon: Icon(Icons.phone),
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16.h),
|
||||
TextField(
|
||||
controller: _pwdCtrl,
|
||||
obscureText: !_showPwd, // 密文/明文由状态决定
|
||||
decoration: InputDecoration(
|
||||
labelText: "密码",
|
||||
hintText: "请输入密码",
|
||||
prefixIcon: const Icon(Icons.lock),
|
||||
border: const OutlineInputBorder(),
|
||||
// suffixIcon:右侧小眼睛,点击切换明文
|
||||
suffixIcon: IconButton(
|
||||
icon: Icon(_showPwd ? Icons.visibility : Icons.visibility_off),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_showPwd = !_showPwd; // 修改状态触发重建
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 24.h),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
// 获取输入内容
|
||||
String user = _userCtrl.text;
|
||||
String pwd = _pwdCtrl.text;
|
||||
if (kDebugMode) {
|
||||
print("账号:$user,密码11:$pwd");
|
||||
}
|
||||
},
|
||||
child: const Text("登录"),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user