百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

flutter软件开发笔记24-回到原点,手搓代码

zhezhongyun 2025-05-26 20:15 27 浏览

原来一直使用qt c++开发,界面直接用界面设计师,也习惯了这种方法,改用代码方式设计界面一直不习惯,但flutter开发,没有界面设计师,只能用代码方式,学习了一个月这个框架了,今天尝试手动写原代码,突破这个结界。

理解 Flutter 代码逻辑需要从框架的核心设计入手。以下通过一个 手搓代码的极简指南,配合关键概念和可修改的代码示例,帮助你快速掌握 Flutter 的代码逻辑设计思想:


一、Flutter 代码核心逻辑(关键记忆点)

  1. 万物皆 Widget
  2. 界面元素(按钮、文本)、布局(行、列)、甚至整个页面都是 Widget
  3. 分为 无状态(StatelessWidget)和 有状态(StatefulWidget)
  4. 声明式 UI
  5. 通过 build() 方法 描述 UI 应该长什么样(而非逐步“绘制”)
  6. 当状态变化时,Flutter 自动对比新旧 Widget 树,智能更新差异部分
  7. 树状结构嵌套
  8. 通过 Widget 的嵌套组合构建复杂界面(类似 HTML 的嵌套结构)
  9. 如: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 快速查看修改效果
  • 故意写错代码,观察控制台错误提示

四、逻辑训练路线

  1. 基础阶段:修改现有代码中的文字、颜色、边距
  2. 中级阶段:添加新的交互元素(开关、滑动条)
  3. 高级阶段:拆分子组件、传递回调函数
  4. 实战阶段:结合路由导航,实现多页面数据传递

五、常见问题解答

Q1:为什么要有 StatefulWidget 和 StatelessWidget 的区别?
→ 区分是否需要内部状态管理,优化渲染性能。

Q2:setState() 是做什么的?
→ 通知 Flutter 框架:“我的状态变了,请重新调用 build() 方法更新UI”。

Q3:为什么 Widget 要层层嵌套?
→ Flutter 通过组合简单 Widget 实现复杂效果,类似搭积木。

相关推荐

Trump Pushes for 15%-20% Minimum Tariffs on EU, Sticks to Auto Duties: Report

TMTPOST--U.S.PresidentDonaldTrumpistakingatougherstanceduringtradenegotiationswiththe...

Note-15.使用A4988控制步进电机(dvp15mc11t控制步进电机)

如果需要控制一堆步进电机,那么只使用一个Arduino来控制,就会占用大量的处理时间,而无法处理其他事情,除非使用一个独立的专用步进电机驱动器:A4988。A4988只需两个引脚就可以控制双极步进电机...

Negotiated settlement, not sanctions, the right way to end the Ukraine crisis

Negotiatedsettlement,notsanctions,therightwaytoendtheUkrainecrisis:ChinaDailyeditorial...

U.S. Services May be Added to EU&#39;s Retaliatory Target List as More Members Seek Powerful Trade Tool If Talks Fail

TMTPOST--AmericanservicescouldbeaddedtotheEuropeanUnion’sretaliatorytargetlist,highlig...

S7-1200伺服指令运动指令(s71200伺服位置控制实例)

1.MC_Halt指令名称:停止轴运行指令功能:停止所有运动并以组态的减速度停止轴。使用技巧:常用MC_Halt指令来停止通过MC_MoveVelocity指令触发的轴的运行。『注意』部分输入/输出管...

Deepseek太强了!等了10年的Excel模糊下拉,竟然5分钟就搞定了

今天跟大家分享下我们如何通过Deepseek来编写VBA代码,制作模糊搜索的下拉菜单,这个等来十来年的功能,用Deepseek竟然几分钟就搞定了,不得不感叹AI工具的强大,我们以后能干的过AI吗,这真...

7.Unity物理关节(unity物理骨骼)

7.物理关节Unity的物理关节组件将刚体连接到另一个刚体或空间中的固定点。施加使刚体移动的力,关节限制可以限制移动。关节赋予刚体一定的自由度,从而使这些刚体具有不同的运动。Unity提供的物理关...

西门子111报文对应FB284引脚(西门子111报文详解)

西门子FB284是基于111报文的功能块,使用FB284比较方便,直接调用就可以控制V90伺服的定位控制。下面是整理的FB284对应的111报文。便于理解FB284功能块,更方面应用在实际项目中。11...

数据质量动态探查及相关前端实现(数据质量改进实践指南)

需求背景数据探查上线之前,数据验证都是通过写SQL方式进行查询的,从编写SQL,到解析运行出结果,不仅时间长,还会反复消耗计算资源,探查上线后,只需要一次探查,就可以得到整张表的探查报告,但后续...

阿里面试官:你连个排序算法都讲不明白?出门右拐吧

排序算法一表总览其他注意事项:计数排序中,kkk是整数的范围稳定性是指,序列中相同的数是否有可能交换顺序,例如序列中有两个8,顺序为888和8′8^{'}8′,如果在排序完之后,顺序有...

直流电机速度、位置双环控制简明教程

速度、位置的双环控制是我们在电机的控制系统中常用的方法,很实用。下面让我们来看一下内部实现的原理。1.速度闭环控制我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器...

纳米机器人的精准定位与导航(纳米机器人怎么控制位置)

纳米机器人的精准定位与导航涉及多学科交叉技术,其“源码”(控制逻辑与算法)需结合硬件特性、环境感知和执行器设计。以下从控制原理、算法逻辑、关键技术实现等方面提供概念性思路(非实际可运行代码),供技术探...

C语言进阶教程:多级指针的应用(c语言一级指针和二级指针)

在C语言中,指针可以指向变量的地址。多级指针(PointerstoPointers或MultilevelPointers)则是指向另一个指针地址的指针。这种概念可以扩展到任意级别(二级指针、...

被 Trac 的文件整理能力圈粉了!这 “香” 气挡不住

前阵子整理电脑文件夹时,我遇到了个麻烦:上千个文档和照片,要是手动一个个重命名、分类,不仅手得点到发麻,估计还得耗上一上午。于是我就琢磨着,能不能找个办法实现一键批量重命名。我先在网上搜了些批量改名软...

Enhancer-轻量化的字节码增强组件包

一、问题描述当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的ToC的互联网企业来说,整个系统都是...