网站首页 > 博客文章 正文
原来一直使用qt c++开发,界面直接用界面设计师,也习惯了这种方法,改用代码方式设计界面一直不习惯,但flutter开发,没有界面设计师,只能用代码方式,学习了一个月这个框架了,今天尝试手动写原代码,突破这个结界。
理解 Flutter 代码逻辑需要从框架的核心设计入手。以下通过一个 手搓代码的极简指南,配合关键概念和可修改的代码示例,帮助你快速掌握 Flutter 的代码逻辑设计思想:
一、Flutter 代码核心逻辑(关键记忆点)
- 万物皆 Widget
- 界面元素(按钮、文本)、布局(行、列)、甚至整个页面都是 Widget
- 分为 无状态(StatelessWidget)和 有状态(StatefulWidget)
- 声明式 UI
- 通过 build() 方法 描述 UI 应该长什么样(而非逐步“绘制”)
- 当状态变化时,Flutter 自动对比新旧 Widget 树,智能更新差异部分
- 树状结构嵌套
- 通过 Widget 的嵌套组合构建复杂界面(类似 HTML 的嵌套结构)
- 如:Column > Text + Row > Icon + Text + ElevatedButton
二、手搓代码实战指南(带可修改区域)
import 'package:flutter/material.dart';
void main() => runApp(MyApp()); // 程序入口
// 核心组件(整个App的壳)
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp( // Material设计风格
home: HomePage(), // 默认显示首页
);
}
}
// 首页(有状态,可变化)
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _counter = 0; // 状态变量(变化时会触发UI更新)
void _incrementCounter() {
setState(() { // 触发UI更新(必须调用)
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("手搓代码练习")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 显示状态变量
Text('点击次数: $_counter',
style: TextStyle(fontSize: 24)),
SizedBox(height: 20),
// 修改状态的按钮
ElevatedButton(
onPressed: _incrementCounter,
child: Text("点我增加"),
),
// 下方自由添加你的代码
// ----------------------------------
// (在此处添加你的实验代码)
// 例如:尝试加一个图片、输入框或新按钮
SizedBox(height: 20),
ElevatedButton(
onPressed: () => print("你点击了我!"),
child: Text("实验按钮"),
),
TextField(
decoration: InputDecoration(hintText: "输入文字试试"),
onChanged: (text) => print("输入内容: $text"),
)
// ----------------------------------
],
),
),
);
}
}
三 界面运行效果
四 理解与调试
1.理解代码结构(关键注释)
代码段 | 作用说明 |
setState(() { ... }) | 标记状态变化,触发UI重新渲染 |
build() 方法 | 声明当前 Widget 的UI结构 |
MaterialApp | 应用全局样式和导航的容器 |
Scaffold | 提供页面基础结构(AppBar/Body等) |
2. 调试技巧
- 在 onPressed 或 onChanged 中添加 print() 观察交互
- 使用 flutter hot reload 快速查看修改效果
- 故意写错代码,观察控制台错误提示
四、逻辑训练路线
- 基础阶段:修改现有代码中的文字、颜色、边距
- 中级阶段:添加新的交互元素(开关、滑动条)
- 高级阶段:拆分子组件、传递回调函数
- 实战阶段:结合路由导航,实现多页面数据传递
五、常见问题解答
Q1:为什么要有 StatefulWidget 和 StatelessWidget 的区别?
→ 区分是否需要内部状态管理,优化渲染性能。
Q2:setState() 是做什么的?
→ 通知 Flutter 框架:“我的状态变了,请重新调用 build() 方法更新UI”。
Q3:为什么 Widget 要层层嵌套?
→ Flutter 通过组合简单 Widget 实现复杂效果,类似搭积木。
猜你喜欢
- 2025-05-23 Flutter——路由
- 2025-05-23 flutter软件开发笔记18-线程管理
- 2025-05-23 Flutter TextField 边框样式以及提示文本
- 2025-05-23 Flutter缓存数据可以怎么做
- 2025-05-23 flutter软件开发笔记20-flutter web开发
- 2025-05-23 flutter软件开发笔记25-内置组件总结
- 2025-05-23 flutter软件开发笔记17-isolate的机制作用
- 2025-05-23 Flutter实战经验(十二):不同平台操作体验的差异和适配(一)
- 2025-05-23 Flutter GetX 硬核分享:Rx 扩展方法实践指南
- 2025-05-23 Flutter与Android iOS 的双向通信
你 发表评论:
欢迎- 380℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 375℃用AI Agent治理微服务的复杂性问题|QCon
- 375℃IT全明星|IntelliJ IDEA学习笔记(四、idea中怎么创建maven项目)
- 366℃初次使用IntelliJ IDEA新建Maven项目
- 359℃Maven技术方案最全手册(mavena)
- 356℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 354℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 353℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)