Flutter 3 基础08: 添加文本框

在前两篇文章中,我们为页面添加了一个按钮并优化了代码质量,可以让我们更健壮地添加更多部件。

本文将继续为部件页面增添一个新的部件------文本框,进一步丰富页面。

启动 Android Studio,打开 hello_world 项目,运行虚拟机,这样就可以实时看到编码产生的效果。现在,我们依然只能看到部件页面的绿色按钮。

添加文本输入控件

  1. 在 lib/widget 文件夹下,打开 my_button.dart 文件,定位到下列代码:
dart 复制代码
return MaterialButton(  
  textColor: Colors.white,  
  color: Colors.green,  
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),  
  onPressed: () {  
    print('按钮被点击');  
  },  
  child: const Text('显示'),  
);

并替换为以代码:

dart 复制代码
return Column(  
  children: [  
    const TextField(),  
    MaterialButton(  
      textColor: Colors.white,  
      color: Colors.green,  
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),  
      onPressed: () {  
        print('按钮被点击');  
      },  
      child: const Text('显示'),  
    )  
  ],  
);

这里,我们需要返回文本框和按钮两个部件,所以使用了一个列布局容器 Column 进行包装。 Column 会将放入其中的子部件进行竖直排列,因此,我们的文本框会位于按钮的上方。

热重启项目,可以看到,文本框已经出现在部件页面上:

设置容器填充

通过观察页面我们发现,文本框与页面两侧紧挨在一起,不利于用户操作和阅读内容。现在我们来增加一些间隙。

在 main.dart 文件中,定位到以下列码:

dart 复制代码
child: const MyButton()),

在这行代码的上面,添加下面的代码:

dart 复制代码
padding: const EdgeInsets.all(8.0),

这里,我们为容器的四边添加了 8 像素的填充,避免容器与其子部件紧贴在一起。

热重启项目。我们可以看到,文本框左右两端与页面两侧边界之间留出了空白。

美化文本框

如果你觉得文本框的默认样式(像极了下划线)不太像一个"框",我们可以进行一些优化。

在 my_button.dart 文件中,定位到下列代码:

dart 复制代码
const TextField(),

并替换为以下代码:

dart 复制代码
const TextField(  
  decoration: InputDecoration(  
      border: OutlineInputBorder(),  
      hintText: "请输入一些文字。"),  
),

这里,我们通过文本框的 decoration 属性,其值是一个 InputDecoration 类的实例,用来装饰文本框:

  • border: 设置文本框的边框样式。
  • hintText: 设置文本框的输入提示文字,即占位符。

热重启项目。我们可以看到,文本框变身为圆角矩形框并提示用户输入一些内容。

重构按钮文件

这时候,我们发现 my_button.dart 文件已经混入了文本框,不单纯是按钮代码了,而且会加入更多部件。因此,我们需要进行重命名操作,与文件内容匹配。

  • 把 my_button.dart 重命名为 my_widgets.dart.
  • 把 MyButton 重命名为 MyWidgets.

重命名操作详细步骤,可以参考 Flutter 3 基础03: 初始化"自己"的 Flutter 项目

提交代码

我们已经完成了文本框的添加,又到达了一个小小的里程碑,应该对代码进行提交,保持良好编程习惯。

shell 复制代码
git add .
git commit -m '添加一个文本框。'
相关推荐
kill522几秒前
useRef
前端·javascript·react.js
蓝悦无人机2 分钟前
从“摸形状“到“点到线面的距离“——聊聊 SLAM 前端(激光雷达篇)
前端·loam·数据关联·激光slam·点云特征提取·点到线面距离·icp/ndt
程序员老刘8 分钟前
Flet 1.0 思路很好,可惜来晚了
flutter·ai编程·客户端
flash俊杰32 分钟前
工程约束怎么不拖后腿
前端
霍营_托尼43 分钟前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
溪语流沙44 分钟前
【Web全栈进阶】FastAPI工程化:APIRouter拆分 + 配置 + 依赖注入
java·前端·fastapi
Shirley~~1 小时前
Three.js的基础概念
前端·3d
deli0071 小时前
黏菌没有大脑,3000 个 Physarum 粒子跑 12973 步自己铺出了迷宫最短路
前端
凌云若寒1 小时前
BarTender提示#807错误:无法在拥有其他许可证的Licensing Service上激活节点锁定的 Professional 版许可证 的解决办法
运维·服务器·前端·学习·软件需求
嘟嘟同学和妮妮同学1 小时前
用原生 JS 做了一个中国历史帝皇梳理的可视化站(7 朝 77 帝 + Leaflet 地图)
前端