当前位置: 首页 > news >正文

Flutter桌面开发(三、widget布局与表单)

一、流式布局
横铺或者竖着铺
Row 或者 Column
这俩都是有Children的就是可以有多个子元素

例子:

Row(
	Children:[
		Container(),
		Container(),
		Container(),
	]

Container 类似于 html中的DIV 可以设置背景 border 和 宽度高度

Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      image: AssetImage('assets/images/login_bg.webp'),
      fit: BoxFit.cover,
    ),
  ),
),

另外,如果需要在一个元素上添加手表手势和点击事件,就需要使用其他支持的widget嵌套

 MouseRegion(
    cursor: SystemMouseCursors.basic, // 鼠标手势
    child: GestureDetector( // 绑定点击事件
      onTap: isLoginButtonEnabled ? handleLogin : null,
      child: Container(

元素和元素之间的间距 可以使用Container设置Padding Margin 或者 使用设置宽或者高的SizeBox


padding: const EdgeInsets.only(top: 10, bottom: 10),

EdgeInsets.all 所有

SizedBox(width: 16),

居中定位使用Center 这个widget. 配合 中轴线使用

Center(
  child: Image.asset(
    'assets/images/login_logo.webp',
    width: 123,
    height: 40,
    fit: BoxFit.cover,
  ),
)

水平和垂直居中
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,

二、层叠布局
需要使用 Stack和Positioned
类似于 html中的position absolute但是 还是有差别的
一定要注意 Stack 是 Z轴 包住的部分在下面 Postioned 弹出在Stack上
在这里插入图片描述

三、表单
表单主要是输入框

TextField(
   controller: _controller,
   cursorHeight: 14,
   textAlignVertical: TextAlignVertical.center,
   style: TextStyle(
     fontSize: 14,
     height: 1.5,
   ),
   decoration: InputDecoration(
     border: InputBorder.none,
     hintText: '请输入手机号',
     contentPadding: const EdgeInsets.only(top: 15, bottom: 15, left: 2),
     hintStyle: TextStyle(
       fontSize: 14,
       color: Color.fromRGBO(191, 191, 191, 1),
     ),
   ),
   keyboardType: TextInputType.number,
   inputFormatters: [
     FilteringTextInputFormatter.digitsOnly,
     LengthLimitingTextInputFormatter(11)
   ],
   onChanged: (text) {
     print('phone number field: $text (${text.characters.length})');
     widget.updatePhoneNumber(text);
   },
 ),

需要数据同步就要用到 TextEditingController

 late TextEditingController _controller;
 late TextEditingController _controller_email;

  
  void initState() {
    super.initState();
    _controller = TextEditingController(text: widget.phoneNumber);
    _controller_email = TextEditingController(text: widget.emailAddress);
  }

  
  void dispose() {
    _controller.dispose();
    _controller_email.dispose();
    super.dispose();
  }

其中 keyboardType: TextInputType.number, 限制只能输入数字
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
LengthLimitingTextInputFormatter(11)
],
限制最长11位

四、 自适应布局 Expanded

相关文章:

  • Qt的QToolButton设置弹出QMenu下拉菜单
  • 如何实现Spring Boot与Oracle数据库的完美对接?
  • 2025-03-12 学习记录--C/C++-PTA 习题8-4 报数
  • 12. Pandas :使用pandas读Excel文件的常用方法
  • WPF 制作机械手动画
  • 在线教育网站项目第三步 :通过wsl 2 安装ubuntu24.04
  • nginx中proxy_pass和root的区别
  • Flask
  • 抖音生活服务联动监管开展专项整治 济南66家违规餐饮商家下架
  • XSS跨站脚本攻击
  • ESP32芯片模组方案,设备物联网无线通信,WiFi蓝牙交互控制应用
  • Java中main函数中public static void main2(String[] args) 的String[] args是什么意思?
  • 用SpringBoot做一个web小案例实现登录
  • 宇树ROS1开源模型在ROS2中Gazebo中仿真
  • HCIE考试经验分享:我的华为云服务HCIE认证奋斗史
  • Java 大视界 -- Java 大数据在智慧文旅虚拟导游与个性化推荐中的应用(130)
  • 【PyMySQL】Python操作MySQL
  • Html5记忆翻牌游戏开发经验分享
  • 通过deepseek学习lua写网页
  • SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突
  • 江南考古文脉探寻
  • AI赋能科学红毯,机器人与科学家在虚实之间叩问“科学精神”
  • 天算星座二期首批卫星成功发射,将助力6G空天信息基础设施建设
  • 中国恒大披露清盘进展:要求债权人提交债权证明表
  • 广西等地旱情缓解,水利部针对甘肃启动干旱防御Ⅳ级响应