<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: shanxing</title>
    <description>The latest articles on DEV Community by shanxing (@shanxing).</description>
    <link>https://dev.to/shanxing</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4129110%2Fe4b579c0-0bd5-446a-9e6e-c6d28f0a90cb.jpg</url>
      <title>DEV Community: shanxing</title>
      <link>https://dev.to/shanxing</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shanxing"/>
    <language>en</language>
    <item>
      <title>Flutter从widgt到源码</title>
      <dc:creator>shanxing</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:33:05 +0000</pubDate>
      <link>https://dev.to/shanxing/fluttercong-widgtdao-yuan-ma-33hl</link>
      <guid>https://dev.to/shanxing/fluttercong-widgtdao-yuan-ma-33hl</guid>
      <description>&lt;h1&gt;
  
  
  📱 Flutter 学习笔记 · 第 1 课「Hello World」— 多书合集 · L3 版
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;课程来源&lt;strong&gt;：①《Learn Google Flutter Fast: 65 Example Apps》ch9｜&lt;/strong&gt;学习日期&lt;strong&gt;：2026-08-13（Day 1）｜&lt;/strong&gt;L3 升级**：2026-09-16&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;今日目标&lt;/strong&gt;：看懂并手写你的第一个 Flutter 程序，理解 Flutter 最底层的几个概念&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;前置知识&lt;/strong&gt;：你有 Python/Java/JS 基础，但没有移动端经验 —— 本笔记专门为这个起点设计&lt;br&gt;
🎯 &lt;strong&gt;L3 目标&lt;/strong&gt;：不止「会写 Hello World」。要能回答：&lt;strong&gt;&lt;code&gt;runApp&lt;/code&gt; 那一行到底做了什么？为什么说「Widget 不是界面」？&lt;code&gt;Center&lt;/code&gt; 的源码为什么只有 4 行却能居中？&lt;code&gt;Scaffold&lt;/code&gt; 除了背景色还白送了什么？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📎 看不懂「文件:行号」？先读这里
&lt;/h2&gt;

&lt;p&gt;本笔记每处 &lt;code&gt;widgets/binding.dart:1883&lt;/code&gt; 这类标注，&lt;strong&gt;都紧跟代码块贴出真实源码&lt;/strong&gt;（本机 SDK 3.44.0 磁盘逐字读出）。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;1883|&lt;/code&gt; 是&lt;strong&gt;磁盘真实行号，不是代码的一部分&lt;/strong&gt; —— 只看 &lt;code&gt;|&lt;/code&gt; 右边。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;自己核对：&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'1883,1886p'&lt;/span&gt; /opt/homebrew/share/flutter/packages/flutter/lib/src/widgets/binding.dart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;全量源码对照册：&lt;a href="//./day1_source_appendix.md"&gt;&lt;code&gt;day1_source_appendix.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  python3 /Volumes/external/learning/flutter-learning/shared/tools/extract_refs.py &lt;span class="se"&gt;\&lt;/span&gt;
          /Volumes/external/learning/flutter/day1_study.md &lt;span class="nt"&gt;--emit&lt;/span&gt;
  python3 /Volumes/external/learning/flutter-learning/shared/tools/verify_inline_code.py &lt;span class="se"&gt;\&lt;/span&gt;
          /Volumes/external/learning/flutter/day1_study.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  一、核心概念定义（先建立正确的第一印象）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Flutter 是什么？
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Flutter 是 Google 开发的跨平台 UI 框架&lt;/strong&gt;。你用 &lt;strong&gt;Dart 语言&lt;/strong&gt;写一套代码，就能同时编译成 iOS 应用、Android 应用、网页、桌面程序。核心理念：&lt;strong&gt;「一切皆 Widget」（Everything is a Widget）&lt;/strong&gt; —— 界面上你能看到的每一个东西，本质都是一个 Widget。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 类比：Flutter 就像一套&lt;strong&gt;乐高积木系统&lt;/strong&gt;。你不需要为 iOS 造一套零件、为 Android 再造一套，而是用同一批「积木」拼出界面，最后由 Flutter 帮你翻译成各平台能运行的「成品」。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Widget 是什么？（🃏 术语卡 1 —— &lt;strong&gt;本日头号术语&lt;/strong&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：&lt;strong&gt;一段不可变的「界面配置说明书」&lt;/strong&gt; —— 描述「界面上某一块长什么样、该怎么显示」的数据对象。&lt;strong&gt;它不是屏幕上的像素。&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;源码依据&lt;/strong&gt;（今天最重要的三行）：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/framework.dart:312-314（Widget 类声明 · 磁盘逐字）&lt;/span&gt;
 &lt;span class="mi"&gt;312&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Widget&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;DiagnosticableTree&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;313&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// Initializes [key] for subclasses.&lt;/span&gt;
 &lt;span class="mi"&gt;314&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐ 构造函数是 const ⇒ Widget 是【不可变】的配置对象&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/framework.dart:340-349（createElement —— 三棵树的入口 · 磁盘逐字 · 节选：略去 :341 空行）&lt;/span&gt;
 &lt;span class="mi"&gt;340&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// Inflates this configuration to a concrete instance.&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ 中文：「把这份配置『充气』成一个具体实例」&lt;/span&gt;
 &lt;span class="mi"&gt;342&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// A given widget can be included in the tree zero or more times. In particular&lt;/span&gt;
 &lt;span class="mi"&gt;343&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// a given widget can be placed in the tree multiple times. Each time a widget&lt;/span&gt;
 &lt;span class="mi"&gt;344&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// is placed in the tree, it is inflated into an [Element], which means a&lt;/span&gt;
 &lt;span class="mi"&gt;345&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// widget that is incorporated into the tree multiple times will be inflated&lt;/span&gt;
 &lt;span class="mi"&gt;346&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// multiple times.&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐ 中文：同一个 Widget 可以被放进树里多次；【每次放进树，都会被 inflate 成一个 Element】&lt;/span&gt;
        &lt;span class="c1"&gt;//     ⇒ 这就是「Widget 是图纸、Element 是照图纸盖的房子」的官方出处&lt;/span&gt;
 &lt;span class="mi"&gt;347&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="nd"&gt;@protected&lt;/span&gt;
 &lt;span class="mi"&gt;348&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="nd"&gt;@factory&lt;/span&gt;
 &lt;span class="mi"&gt;349&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;Element&lt;/span&gt; &lt;span class="n"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;      &lt;span class="c1"&gt;// ← ⭐⭐ 抽象方法：每个 Widget 都必须能造出一个 Element&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;读懂这三行，你就懂了 Flutter 的世界观&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;const Widget({this.key})&lt;/code&gt; ⇒ Widget &lt;strong&gt;不可变&lt;/strong&gt;（配置写完就定死了）；&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Element createElement()&lt;/code&gt; ⇒ &lt;strong&gt;每个 Widget 都要「充气」成一个 Element 才能真正进树&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;所以「你写的 Widget」和「屏幕上跑的东西」&lt;strong&gt;根本不是同一个对象&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;常见误解&lt;/strong&gt;：❌「Widget 就是界面上的东西」→ 不。Widget 是&lt;strong&gt;描述&lt;/strong&gt;，真正干活的是 Element（管理生命周期）和 RenderObject（布局+绘制）。&lt;strong&gt;三层各干什么、怎么联动，Day 33 系统化讲&lt;/strong&gt;（今天只认脸，不深入 —— 见 §八 欠账 1）。&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;另一条关键区分（你周考口述曾持有错误模型）&lt;/strong&gt;：约束是&lt;strong&gt;父单方面下达的硬边界&lt;/strong&gt;，子不可突破 —— 不存在「内部约束高于外部时按父或子绘制」。今天先记住「Widget 是配置」，Day 2 讲约束时会正式建立这条。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. 声明式 UI vs 命令式 UI
&lt;/h3&gt;

&lt;p&gt;这是 Flutter 和传统开发（Android 原生、iOS 原生、早期 Swing）最根本的区别：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;命令式 UI（传统）&lt;/th&gt;
&lt;th&gt;声明式 UI（Flutter）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;思路&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;告诉程序&lt;strong&gt;「怎么做」&lt;/strong&gt;：先拿到按钮对象，再一步步 &lt;code&gt;button.setText(...)&lt;/code&gt;、&lt;code&gt;button.setColor(...)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;告诉程序&lt;strong&gt;「要什么」&lt;/strong&gt;：直接声明「界面上应该有一个红色的按钮」，Flutter 负责渲染成那样&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;状态变化时&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;手动找到控件，逐个属性去改&lt;/td&gt;
&lt;td&gt;重建整个 Widget 描述，Flutter 自动对比差异、只更新变化的部分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;类比&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;自己当装修工人，一砖一瓦地改&lt;/td&gt;
&lt;td&gt;当甲方出图纸，说出你要的效果，施工队照图施工&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;一句话概括本质：&lt;strong&gt;命令式是「改控件」，声明式是「描述界面」&lt;/strong&gt;。这个心智模型是理解 Flutter 一切的关键。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔗 &lt;strong&gt;源码印证&lt;/strong&gt;：&lt;code&gt;framework.dart:316-323&lt;/code&gt; 的 &lt;code&gt;key&lt;/code&gt; 字段文档原话 —— 「如果两个 widget 的 &lt;code&gt;runtimeType&lt;/code&gt; 和 &lt;code&gt;key&lt;/code&gt; 相等，新 widget 就&lt;strong&gt;替换&lt;/strong&gt;旧的（通过 &lt;code&gt;Element.update&lt;/code&gt;）；否则旧 element 被移除、新 widget 被 inflate 成新 element 插入树中」。&lt;strong&gt;这就是「Flutter 自动对比差异」的机制出处&lt;/strong&gt;（Day 32 Keys 专题会深挖）。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  二、生活化类比（把抽象概念变成画面）
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;抽象概念&lt;/th&gt;
&lt;th&gt;生活化类比&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Widget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;乐高积木块&lt;/strong&gt;。每一块都有固定形状和用途，可以无限组合。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Widget 树&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;俄罗斯套娃&lt;/strong&gt;，或倒过来的&lt;strong&gt;家族族谱&lt;/strong&gt;。最大的套中号、中号套小号……界面就是一层层「嵌套」出来的：&lt;code&gt;MaterialApp&lt;/code&gt; → &lt;code&gt;Scaffold&lt;/code&gt; → &lt;code&gt;Center&lt;/code&gt; → &lt;code&gt;Text&lt;/code&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;runApp()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;「点火/插电」动作&lt;/strong&gt;。积木搭好了，不调 &lt;code&gt;runApp()&lt;/code&gt; 等于拼好的积木瘫在桌上 —— &lt;strong&gt;没通电，屏幕不会亮&lt;/strong&gt;。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MaterialApp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;「整套房子的地基和物业管理」&lt;/strong&gt;：决定整体主题色、字体、页面路由这些全局规则。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaffold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;「房子的承重骨架」&lt;/strong&gt;：预留好天花板（AppBar）、地板（bottomNavigationBar）、墙壁（body）的位置。没有它，家具（文字）没地方摆。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;build() 方法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;「装配说明图纸」&lt;/strong&gt;。Flutter 问「这个组件长啥样？」，你通过 build() 返回一摞 Widget 作为回答。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;StatelessWidget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;「静物画」&lt;/strong&gt;：画好之后永远不变，没有内部状态。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Widget vs Element&lt;/strong&gt;（今天新增）&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;图纸 vs 房子&lt;/strong&gt;。Widget 是图纸（可以复印很多份、不可改），Element 是照图纸盖出来的房子（真实占着地、有生命周期）。源码 &lt;code&gt;:344&lt;/code&gt; 的 "inflated into an Element" 就是这个意思。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  三、今天结束前要能口述的 3 句
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;每句都必须能指到&lt;strong&gt;源码行号&lt;/strong&gt;（导师会追问）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;runApp&lt;/code&gt; 只有 3 行：初始化绑定 → 把根 widget 包进默认 View → 调度「挂载根 widget + 热身一帧」。&lt;/strong&gt; 它干的是「通电」，不是「画画」。&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;依据：&lt;code&gt;widgets/binding.dart:1883-1886&lt;/code&gt;（全文 3 行）+ &lt;code&gt;:1948-1953&lt;/code&gt;（&lt;code&gt;_runWidget&lt;/code&gt; 的 &lt;code&gt;scheduleAttachRootWidget&lt;/code&gt; + &lt;code&gt;scheduleWarmUpFrame&lt;/code&gt;）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Widget 是「不可变的配置」，不是界面本身 —— 每个 Widget 进树时都会被 &lt;code&gt;createElement()&lt;/code&gt; 充气成一个 Element。&lt;/strong&gt; 所以「我写的 Widget」和「屏幕上跑的东西」不是同一个对象。&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;依据：&lt;code&gt;widgets/framework.dart:312-314&lt;/code&gt;（&lt;code&gt;const Widget({this.key})&lt;/code&gt;）+ &lt;code&gt;:340-349&lt;/code&gt;（&lt;code&gt;Element createElement();&lt;/code&gt; 抽象方法 + 官方文档 "Each time a widget is placed in the tree, it is inflated into an Element"）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Center&lt;/code&gt; 的源码只有 4 行，它之所以能居中，是因为它继承 &lt;code&gt;Align&lt;/code&gt; 而 &lt;code&gt;Align&lt;/code&gt; 的 &lt;code&gt;alignment&lt;/code&gt; 参数默认值就是 &lt;code&gt;Alignment.center&lt;/code&gt;。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;依据：&lt;code&gt;widgets/basic.dart:2550-2553&lt;/code&gt;（Center 全部源码）+ &lt;code&gt;:2466-2468&lt;/code&gt;（&lt;code&gt;this.alignment = Alignment.center&lt;/code&gt;）。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  四、关键 Widget / API 逐个讲解
&lt;/h2&gt;

&lt;p&gt;先看&lt;strong&gt;完整可运行代码&lt;/strong&gt;，再逐个拆解：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. 导入 Flutter 的 Material 组件库（几乎所有 App 都要这一行）&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 2. 程序入口：main() 函数，App 从这里开始执行&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 3. runApp()：把根 Widget「插上电」，Flutter 开始渲染&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 4. 自定义的根 Widget：继承 StatelessWidget（无状态组件）&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;          &lt;span class="c1"&gt;// 构造函数（super.key 见 §六-5.5）&lt;/span&gt;

  &lt;span class="c1"&gt;// 5. build()：返回「这个组件长什么样」&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 6. MaterialApp：全局外壳，定义主题和首页&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// 应用标题（系统任务切换器里显示，界面上看不到）&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;            &lt;span class="c1"&gt;// 7. 首页交给 Scaffold 搭建骨架&lt;/span&gt;
        &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;          &lt;span class="c1"&gt;// 8. 顶部标题栏&lt;/span&gt;
          &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;      &lt;span class="c1"&gt;// 9. 正文区：让内容居中&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;           &lt;span class="c1"&gt;// 10. 要显示的文字&lt;/span&gt;
            &lt;span class="s"&gt;'Hello World!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;运行效果&lt;/strong&gt;：一个带顶部标题栏、正文区正中央显示 "Hello World!" 的应用。&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 &lt;code&gt;main()&lt;/code&gt; —— 程序的入口
&lt;/h3&gt;

&lt;p&gt;Dart 和 C/Java 一样，程序从 &lt;code&gt;main()&lt;/code&gt; 开始执行，是&lt;strong&gt;整个 App 的起点&lt;/strong&gt;。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 这里写 App 启动后第一件要做的事&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;void&lt;/code&gt;：这个函数不返回任何值。&lt;/li&gt;
&lt;li&gt;你以前写 Java 的 &lt;code&gt;public static void main(String[] args)&lt;/code&gt;，在 Dart 里就是简洁的 &lt;code&gt;void main()&lt;/code&gt; —— &lt;strong&gt;不需要类包裹，直接写在文件顶层&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2 &lt;code&gt;runApp()&lt;/code&gt; —— 让界面「亮起来」（💎 今天最该读的 3 行源码）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/binding.dart:1883-1886（runApp 全文 —— 就 3 行！磁盘逐字）&lt;/span&gt;
 &lt;span class="mi"&gt;1883&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;1884&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;WidgetsBinding&lt;/span&gt; &lt;span class="n"&gt;binding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WidgetsFlutterBinding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ensureInitialized&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ① 确保「绑定」已初始化（绑定 = Flutter 与底层引擎/系统的总管家）&lt;/span&gt;
 &lt;span class="mi"&gt;1885&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;_runWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;wrapWithDefaultView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'runApp'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ② 把你的根 widget 包进「默认 View」，再交给 _runWidget&lt;/span&gt;
 &lt;span class="mi"&gt;1886&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/binding.dart:1948-1953（_runWidget 全文 · 磁盘逐字）&lt;/span&gt;
 &lt;span class="mi"&gt;1948&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;_runWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WidgetsBinding&lt;/span&gt; &lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;debugEntryPoint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="mi"&gt;1949&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debugCheckZone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debugEntryPoint&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
 &lt;span class="mi"&gt;1950&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="n"&gt;binding&lt;/span&gt;
 &lt;span class="mi"&gt;1951&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scheduleAttachRootWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;// ← ⭐ ③ 调度「把根 widget 挂到树上」&lt;/span&gt;
 &lt;span class="mi"&gt;1952&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scheduleWarmUpFrame&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;             &lt;span class="c1"&gt;// ← ⭐ ④ 调度「热身一帧」⇒ 界面这才亮起来&lt;/span&gt;
 &lt;span class="mi"&gt;1953&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意 &lt;code&gt;:1950-1952&lt;/code&gt; 的 &lt;code&gt;..&lt;/code&gt; 是 Dart 的「级联调用」语法&lt;/strong&gt;（§六-5.6 有讲）：&lt;code&gt;binding..A()..B()&lt;/code&gt; = 对同一个 binding 连续调 A 和 B。&lt;strong&gt;这不是 Flutter 特有的东西，是 Dart 语法&lt;/strong&gt; —— 第一次见容易懵，特意标出来。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;这 3+5 行源码回答了 4 个问题&lt;/strong&gt;：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;源码答案&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;runApp&lt;/code&gt; 是「画画」吗？&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;不是&lt;/strong&gt;。它只做「初始化 + 挂载 + 调度一帧」，真正画画在后面的帧流程里（layout → paint，Day 2/33）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;为什么忘了 &lt;code&gt;runApp&lt;/code&gt; 就白屏？&lt;/td&gt;
&lt;td&gt;因为 &lt;code&gt;MyApp()&lt;/code&gt; 只是&lt;strong&gt;造了一个配置对象&lt;/strong&gt;（图纸），没人把它「充气」进树、没人调度帧 ⇒ 屏幕什么都没被要求画（误区 1）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;「根 widget」是什么意思？&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;:1885&lt;/code&gt; 的 &lt;code&gt;wrapWithDefaultView(app)&lt;/code&gt; —— 你的 MyApp 被包进一个 View，成为整棵树的&lt;strong&gt;根&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;为什么叫「热身帧」？&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scheduleWarmUpFrame&lt;/code&gt;（&lt;code&gt;:1952&lt;/code&gt;）—— 第一帧是「预热」，让树先建起来再画&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 &lt;strong&gt;这是整个 Hello World 的「命门」&lt;/strong&gt;：&lt;code&gt;main()&lt;/code&gt; 里如果忘了调用 &lt;code&gt;runApp()&lt;/code&gt;，程序能编译通过、也不报错，但&lt;strong&gt;屏幕永远一片空白&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.3 &lt;code&gt;MaterialApp&lt;/code&gt; —— 全局外壳
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 应用名，显示在系统任务切换器&lt;/span&gt;
  &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(...),&lt;/span&gt;      &lt;span class="c1"&gt;// 首页（第一个显示的页面）&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：一个 &lt;strong&gt;StatefulWidget&lt;/strong&gt;（&lt;code&gt;material/app.dart:217&lt;/code&gt; &lt;code&gt;class MaterialApp extends StatefulWidget&lt;/code&gt;），提供遵循 &lt;strong&gt;Material Design&lt;/strong&gt; 的全局环境，负责主题、导航、本地化等全局事务。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;常用参数&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;应用标题（&lt;strong&gt;不是界面上显示的文字&lt;/strong&gt;，而是系统级应用名）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;home&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;首页 Widget，App 启动后第一个显示的页面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全局主题（颜色、字体等 —— &lt;strong&gt;Day 35 才深入&lt;/strong&gt;，今天不碰）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;debugShowCheckedModeBanner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否显示右上角 "DEBUG" 标签（默认 true，正式发布前关掉）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 新手常疑惑 &lt;code&gt;title&lt;/code&gt; 为什么界面上看不到 —— 因为 &lt;code&gt;title&lt;/code&gt; 是给&lt;strong&gt;操作系统&lt;/strong&gt;看的（Android 任务列表里的名字），界面上真正显示的文字要靠 &lt;code&gt;AppBar&lt;/code&gt; 和 &lt;code&gt;Text&lt;/code&gt; 自己写。&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;一条 Day 8 会救你一命的知识（提前埋）&lt;/strong&gt;：&lt;code&gt;MaterialApp&lt;/code&gt; &lt;strong&gt;自己不含 Material 层&lt;/strong&gt;（也不含 ScaffoldMessenger 之下的 Scaffold）—— 所以在 &lt;code&gt;MyApp.build&lt;/code&gt; 里直接 &lt;code&gt;ScaffoldMessenger.of(context)&lt;/code&gt; 会崩「No ScaffoldMessenger widget found」，因为那个 context 在 MaterialApp &lt;strong&gt;之上&lt;/strong&gt;，&lt;code&gt;of()&lt;/code&gt; 只朝树根方向找祖先、不往下看。&lt;strong&gt;记住「context 属于写这段 build 的那个 Widget」。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.4 &lt;code&gt;Scaffold&lt;/code&gt; —— 页面骨架（还白送一层 Material）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(...),&lt;/span&gt;     &lt;span class="c1"&gt;// 顶部栏（可选）&lt;/span&gt;
  &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(...),&lt;/span&gt;       &lt;span class="c1"&gt;// 正文主体（核心内容区）&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：一个 &lt;strong&gt;StatefulWidget&lt;/strong&gt;（&lt;code&gt;material/scaffold.dart:1686&lt;/code&gt;），搭建页面&lt;strong&gt;标准骨架&lt;/strong&gt;，自动处理背景色、安全区域（避开刘海/状态栏）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;常用参数&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;appBar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;顶部标题栏（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;页面主要内容区域（最重要）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;floatingActionButton&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;右下角悬浮按钮（后面课用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bottomNavigationBar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;底部导航栏（Day 11 用）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;⭐ Scaffold 白送的一层 Material（源码证据，Day 7 水波纹全靠它）&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// material/scaffold.dart:3232-3238（Scaffold.build 的核心 · 磁盘逐字 · 节选）&lt;/span&gt;
 &lt;span class="mi"&gt;3232&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_ScaffoldScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="mi"&gt;3233&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="nl"&gt;hasDrawer:&lt;/span&gt; &lt;span class="n"&gt;hasDrawer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="mi"&gt;3234&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="nl"&gt;geometryNotifier:&lt;/span&gt; &lt;span class="n"&gt;_geometryNotifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="mi"&gt;3235&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ScrollNotificationObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="mi"&gt;3236&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Material&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐⭐ 就是这一层！Scaffold 内部自己包了一个 Material&lt;/span&gt;
 &lt;span class="mi"&gt;3237&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;themeData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scaffoldBackgroundColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ 背景色从这来（你没给 backgroundColor 就用主题的 scaffoldBackgroundColor）&lt;/span&gt;
 &lt;span class="mi"&gt;3238&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;           &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;这一行解释了两件事&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;为什么缺 Scaffold 会「黑屏/文字没底色」&lt;/strong&gt;（误区 2）—— 背景色是 &lt;code&gt;:3237&lt;/code&gt; 这个 Material 画的，没有 Scaffold 就没人画背景。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;为什么按钮的水波纹能画出来&lt;/strong&gt;（Day 7）—— InkWell 的水波纹是「画在最近的 Material 上的墨迹」，&lt;strong&gt;Scaffold 就自带一层 Material 当画布&lt;/strong&gt;。所以「所有页面都在 MaterialApp→Scaffold 里」不是习惯，是&lt;strong&gt;机制需要&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⚠️ 它和 &lt;code&gt;MaterialApp&lt;/code&gt; 的关系：&lt;code&gt;MaterialApp&lt;/code&gt; 管&lt;strong&gt;整个 App&lt;/strong&gt; 的全局规则，&lt;code&gt;Scaffold&lt;/code&gt; 管&lt;strong&gt;单个页面&lt;/strong&gt;的布局骨架。&lt;strong&gt;一个 App 只有一个 &lt;code&gt;MaterialApp&lt;/code&gt;，但可以有多个 &lt;code&gt;Scaffold&lt;/code&gt;&lt;/strong&gt;（每页一个）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.5 &lt;code&gt;AppBar&lt;/code&gt; —— 顶部标题栏（为什么 Scaffold 认得它）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// 标题栏中间显示的文字&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：页面顶部的应用栏，放标题、返回按钮、操作按钮。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// material/app_bar.dart:189（类声明 —— 注意 implements 后面那个）&lt;/span&gt;
 &lt;span class="mi"&gt;189&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppBar&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;PreferredSizeWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐ 它「实现了 PreferredSizeWidget」= 承诺「我知道自己要多高」&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;为什么这一行重要&lt;/strong&gt;：&lt;code&gt;Scaffold.appBar&lt;/code&gt; 参数的类型是 &lt;code&gt;PreferredSizeWidget?&lt;/code&gt;，&lt;strong&gt;不是 &lt;code&gt;AppBar&lt;/code&gt;&lt;/strong&gt; —— 所以 Scaffold 不需要知道「你是什么组件」，只需要问「你要多高」（&lt;code&gt;preferredSize&lt;/code&gt;）。&lt;strong&gt;这就是「Scaffold 怎么知道该给顶部留 56 高」的答案&lt;/strong&gt;，也是为什么你可以用自定义组件当 appBar（只要它 implements PreferredSizeWidget）。这是 Flutter「&lt;strong&gt;面向接口而非面向类型&lt;/strong&gt;」的第一个例子。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;关键参数&lt;/strong&gt;：&lt;code&gt;title&lt;/code&gt;（标题 Widget）、&lt;code&gt;actions&lt;/code&gt;（右侧操作按钮组）、&lt;code&gt;leading&lt;/code&gt;（左侧自定义组件，默认自动出现返回箭头）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.6 &lt;code&gt;Center&lt;/code&gt; —— 居中容器（源码只有 4 行）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World!'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;// 被居中的子组件&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：&lt;strong&gt;就是 &lt;code&gt;Align&lt;/code&gt;，且 alignment 默认为 center&lt;/strong&gt; —— 源码全部：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/basic.dart:2550-2553（Center 的全部源码 —— 只有 4 行！磁盘逐字）&lt;/span&gt;
&lt;span class="mi"&gt;2550&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Center&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Align&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2551&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="c1"&gt;/// Creates a widget that centers its child.&lt;/span&gt;
&lt;span class="mi"&gt;2552&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;widthFactor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;heightFactor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;child&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐ 注意：它【没有】alignment 参数 —— 所以它只能居中，做不到别的方位&lt;/span&gt;
&lt;span class="mi"&gt;2553&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/basic.dart:2462-2468（Align 的构造函数 · 节选：略去 :2463-2465 的 key/文档 —— 秘密在默认值）&lt;/span&gt;
&lt;span class="mi"&gt;2462&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Align&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;SingleChildRenderObjectWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;2466&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Align&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="mi"&gt;2467&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mi"&gt;2468&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;alignment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Alignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// ← ⭐⭐ 默认值就是 center！&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;&lt;code&gt;Center&lt;/code&gt; 一个字都没写，为什么会居中？&lt;/strong&gt; 因为它继承 &lt;code&gt;Align&lt;/code&gt;，而 &lt;strong&gt;&lt;code&gt;Align&lt;/code&gt; 的 &lt;code&gt;alignment&lt;/code&gt; 默认值就是 &lt;code&gt;Alignment.center&lt;/code&gt;&lt;/strong&gt;（&lt;code&gt;:2468&lt;/code&gt;）。&lt;code&gt;Center&lt;/code&gt; = 「不暴露 alignment 参数的 Align」。&lt;br&gt;
&lt;strong&gt;推论&lt;/strong&gt;：&lt;code&gt;Center(child: x)&lt;/code&gt; ≡ &lt;code&gt;Align(alignment: Alignment.center, child: x)&lt;/code&gt;；&lt;strong&gt;想居左/居右/居上，Center 做不到&lt;/strong&gt;（没暴露参数）⇒ 直接用 &lt;code&gt;Align&lt;/code&gt;。&lt;br&gt;
Align 对应的 RenderObject 是 &lt;code&gt;RenderPositionedBox&lt;/code&gt;（&lt;code&gt;rendering/shifted_box.dart:397&lt;/code&gt;）—— 「真正干活的那层」（Day 2 §4.3 会看到同款套路）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;没有 &lt;code&gt;Center&lt;/code&gt; 时，&lt;code&gt;Text&lt;/code&gt; 会贴在&lt;strong&gt;左上角&lt;/strong&gt; —— 所以它是「让文字出现在屏幕正中」的关键。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.7 &lt;code&gt;Text&lt;/code&gt; —— 显示文字（它自己不画字）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World!'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一句话本质&lt;/strong&gt;：一个 &lt;strong&gt;StatelessWidget&lt;/strong&gt;（&lt;code&gt;widgets/text.dart:497&lt;/code&gt;），把「字符串 + 样式」翻译成 &lt;code&gt;RichText&lt;/code&gt; —— &lt;strong&gt;真正排版画字的是 RichText/RenderParagraph&lt;/strong&gt;。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// widgets/text.dart:780-800（Text.build 造 RichText · 磁盘逐字 · 节选：只留关键 4 行）&lt;/span&gt;
 &lt;span class="mi"&gt;780&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RichText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="mi"&gt;781&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="nl"&gt;textAlign:&lt;/span&gt; &lt;span class="n"&gt;textAlign&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;defaultTextStyle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textAlign&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;TextAlign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;//   ↑ ⭐ 默认对齐是 start（不是 center）；?? 链 = 优先级「你传的 &amp;gt; 默认样式 &amp;gt; start」&lt;/span&gt;
 &lt;span class="mi"&gt;786&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="nl"&gt;overflow:&lt;/span&gt; &lt;span class="n"&gt;overflow&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;effectiveTextStyle&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;overflow&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;defaultTextStyle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="mi"&gt;788&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="nl"&gt;maxLines:&lt;/span&gt; &lt;span class="n"&gt;maxLines&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="n"&gt;defaultTextStyle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maxLines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="mi"&gt;799&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;         &lt;span class="nl"&gt;text:&lt;/span&gt; &lt;span class="n"&gt;effectiveTextSpan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// ← 你的字符串被包成 TextSpan 交给它&lt;/span&gt;
 &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;关键参数&lt;/strong&gt;（&lt;strong&gt;Day 5 会整节展开&lt;/strong&gt;，今天认脸）：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第一个位置参数&lt;/td&gt;
&lt;td&gt;要显示的文字内容（字符串）—— &lt;code&gt;:508&lt;/code&gt; &lt;code&gt;String this.data&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文字样式（&lt;code&gt;TextStyle&lt;/code&gt;），控制字号、颜色、粗细&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;textAlign&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文字对齐方式（⚠️ 默认 &lt;strong&gt;start&lt;/strong&gt;，不是 center）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;今天只需记住一句&lt;/strong&gt;：&lt;strong&gt;&lt;code&gt;Text&lt;/code&gt; 不画字，它把活交给 &lt;code&gt;RichText&lt;/code&gt;&lt;/strong&gt;。这条 Day 5 会完整展开（含 &lt;code&gt;DefaultTextStyle&lt;/code&gt; 的 merge 机制），Day 6 学 Icon 时你还会发现「Icon 也是造 RichText」—— &lt;strong&gt;同一个套路用三次&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  五、新手常见误区（错误写法 vs 正确写法）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  误区 1：忘记 &lt;code&gt;runApp()&lt;/code&gt; → 白屏
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：编译成功、不报错，但打开 App 屏幕一片空白。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ 错误：直接实例化 MyApp，但没交给 runApp&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// 这行什么都没做，MyApp 被创建后立刻丢弃&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 正确：把根 Widget 交给 runApp，Flutter 才会渲染&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;原理（源码级）&lt;/strong&gt;：&lt;code&gt;MyApp()&lt;/code&gt; 只是「造了一个配置对象」（图纸）；&lt;strong&gt;只有 &lt;code&gt;runApp&lt;/code&gt; 才会 &lt;code&gt;scheduleAttachRootWidget&lt;/code&gt; + &lt;code&gt;scheduleWarmUpFrame&lt;/code&gt;&lt;/strong&gt;（&lt;code&gt;binding.dart:1951-1952&lt;/code&gt;）把图纸充气进树、调度第一帧。没人调度帧 ⇒ 屏幕永远空白。&lt;/p&gt;

&lt;h3&gt;
  
  
  误区 2：缺少 &lt;code&gt;Scaffold&lt;/code&gt; → 黑屏或文字贴边
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：屏幕黑底，或文字缩在左上角、背景全黑。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ 直接让 Center 当 home，没有 Scaffold&lt;/span&gt;
&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 用 Scaffold 提供页面骨架和背景&lt;/span&gt;
&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;原理（源码级）&lt;/strong&gt;：背景色是 &lt;strong&gt;&lt;code&gt;scaffold.dart:3236-3237&lt;/code&gt; 那层 Material&lt;/strong&gt; 画的（&lt;code&gt;color: widget.backgroundColor ?? themeData.scaffoldBackgroundColor&lt;/code&gt;）。没有 Scaffold ⇒ 没人画背景 ⇒ 黑底。⚠️ &lt;strong&gt;注意这是「视觉问题」，代码能正常编译运行&lt;/strong&gt;（三类错误的第 ③ 类，Day 3 §七 会正式建立分类）。&lt;/p&gt;

&lt;h3&gt;
  
  
  误区 3：&lt;code&gt;const&lt;/code&gt; 关键字的坑
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：加 &lt;code&gt;const&lt;/code&gt; 报编译错误 &lt;code&gt;Const variables must be initialized with a constant value.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Colors.grey[600] 是「运行时查表」操作，不是常量&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 去掉外层 const，允许运行时求值&lt;/span&gt;
&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 或者改用编译期常量&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：&lt;code&gt;const&lt;/code&gt; 要求&lt;strong&gt;编译时就能确定&lt;/strong&gt;的值。&lt;code&gt;Colors.grey&lt;/code&gt; 是一张「色表」（&lt;code&gt;MaterialColor&lt;/code&gt; 常量对象），&lt;code&gt;grey[600]&lt;/code&gt; 是&lt;strong&gt;调用它的 &lt;code&gt;[]&lt;/code&gt; 运算符&lt;/strong&gt;（运行时方法调用）⇒ 编译期算不出来。同理 &lt;code&gt;Colors.blue[200]&lt;/code&gt;、&lt;code&gt;Colors.grey.shade600&lt;/code&gt;（getter 也是运行时）都不行。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 三个 &lt;code&gt;const&lt;/code&gt; 的经验法则：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;能加就加&lt;/strong&gt;：字面量字符串、&lt;code&gt;Colors.white&lt;/code&gt; 这类编译期确定的值，加 &lt;code&gt;const&lt;/code&gt; 能提升性能（Day 1 先照抄模板即可）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;报错了就去掉&lt;/strong&gt;：凡是带 &lt;code&gt;[]&lt;/code&gt; 取色或 &lt;code&gt;.shadeNNN&lt;/code&gt; 的，都不能配 &lt;code&gt;const&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不用纠结&lt;/strong&gt;：去掉 &lt;code&gt;const&lt;/code&gt; 程序照跑不误，它只是性能优化，不是正确性要求。
⚠️ &lt;strong&gt;诚实欠账&lt;/strong&gt;：「const 具体省了多少重建」&lt;strong&gt;未实测&lt;/strong&gt;（&lt;code&gt;identical(const SizedBox(8), const SizedBox(8))&lt;/code&gt; 实测为 false）—— 留 Day 10 用真实重建场景验证。&lt;strong&gt;今天别把 const 当性能银弹。&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  误区 4：把 &lt;code&gt;title&lt;/code&gt; 当成「界面上显示的文字」
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ 误以为这样就能在屏幕上看到「我的应用」&lt;/span&gt;
&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'我的应用'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="p"&gt;...))&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 界面上真正显示的文字，要写在 Text / AppBar 里&lt;/span&gt;
&lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s"&gt;'我的应用'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                  &lt;span class="c1"&gt;// 只显示在系统任务切换器&lt;/span&gt;
  &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'我的应用'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;     &lt;span class="c1"&gt;// 这才是界面上看到的标题&lt;/span&gt;
    &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello World!'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  误区 5：混淆 &lt;code&gt;MaterialApp&lt;/code&gt; 和 &lt;code&gt;Scaffold&lt;/code&gt; 的职责
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;一个 App 只有一个 &lt;code&gt;MaterialApp&lt;/code&gt;&lt;/strong&gt;（在最外层）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一个页面一个 &lt;code&gt;Scaffold&lt;/code&gt;&lt;/strong&gt;（可以有多个）。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Scaffold&lt;/code&gt; 永远放在 &lt;code&gt;MaterialApp&lt;/code&gt; 的 &lt;strong&gt;&lt;code&gt;home&lt;/code&gt;（或路由页面）里面&lt;/strong&gt;，&lt;strong&gt;不是反过来&lt;/strong&gt;把 MaterialApp 塞进 Scaffold。&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;另一个同款错误（你 Day 3 犯过）&lt;/strong&gt;：把 &lt;code&gt;Scaffold&lt;/code&gt; 的内容写成 &lt;code&gt;Scaffold(child: ...)&lt;/code&gt; —— &lt;strong&gt;Scaffold 没有 &lt;code&gt;child&lt;/code&gt; 参数&lt;/strong&gt;，内容要写进 &lt;strong&gt;&lt;code&gt;body:&lt;/code&gt;&lt;/strong&gt;（&lt;code&gt;appBar&lt;/code&gt; / &lt;code&gt;body&lt;/code&gt; / &lt;code&gt;floatingActionButton&lt;/code&gt; 都是具名槽位）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  误区 6：&lt;code&gt;Center&lt;/code&gt; 里写 &lt;code&gt;children&lt;/code&gt;（复数）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Center 只有 child（单数），写 children 编译错「No named parameter」&lt;/span&gt;
&lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;span class="c1"&gt;// ✅ 单数 child&lt;/span&gt;
&lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;为什么会踩&lt;/strong&gt;：后面学 Column/Row（Day 8）时它们是 &lt;code&gt;children&lt;/code&gt;（复数，多子布局）。&lt;strong&gt;记法：单子布局组件用 &lt;code&gt;child&lt;/code&gt;，多子布局组件用 &lt;code&gt;children&lt;/code&gt;&lt;/strong&gt; —— Center/Padding/SizedBox/Card 都是单子（Day 2-3 学的那批）。&lt;/p&gt;




&lt;h2&gt;
  
  
  六、Dart 语法要点（本 App 用到的语法）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 入口 &lt;code&gt;main()&lt;/code&gt; 函数
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 顶层函数，不需要包在类里&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;对比 Java 的 &lt;code&gt;public static void main(String[] args)&lt;/code&gt;，Dart 更简洁。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;void&lt;/code&gt; 是返回类型，&lt;code&gt;main&lt;/code&gt; 是函数名，&lt;code&gt;()&lt;/code&gt; 里没有参数。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 命名参数（Named Parameters）
&lt;/h3&gt;

&lt;p&gt;Dart 最影响 Flutter 代码风格的语法。调用函数时参数用 &lt;strong&gt;&lt;code&gt;名字: 值&lt;/code&gt;&lt;/strong&gt; 传递，&lt;strong&gt;顺序可任意调整&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// 用名字 title 传参&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;好处：函数有十几个可选参数时，不用记顺序、不用传一堆 &lt;code&gt;null&lt;/code&gt;，只写需要的。&lt;/li&gt;
&lt;li&gt;对比位置参数：&lt;code&gt;Text('Hello')&lt;/code&gt; 里的 &lt;code&gt;'Hello'&lt;/code&gt; 是&lt;strong&gt;位置参数&lt;/strong&gt;（必须按顺序、写在最前面）—— 源码 &lt;code&gt;text.dart:508&lt;/code&gt; &lt;code&gt;String this.data&lt;/code&gt; 就是位置参数。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;简单记忆：&lt;strong&gt;位置参数按顺序塞，命名参数挂名字传&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.3 字符串
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="s"&gt;'Hello World!'&lt;/span&gt;   &lt;span class="c1"&gt;// 单引号&lt;/span&gt;
&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;   &lt;span class="c1"&gt;// 双引号，效果完全一样&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Dart 里单引号和双引号&lt;strong&gt;等价&lt;/strong&gt;，Flutter 社区习惯用&lt;strong&gt;单引号&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;拼接用 &lt;code&gt;+&lt;/code&gt; 或字符串插值 &lt;code&gt;'Hello $name'&lt;/code&gt;（Day 5 会讲）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.4 &lt;code&gt;const&lt;/code&gt; 常量关键字
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;            &lt;span class="c1"&gt;// 创建一个「编译期常量」实例&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// 文字内容固定，可标 const&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;const&lt;/code&gt; = &lt;strong&gt;编译时&lt;/strong&gt;就完全确定、永不改变；&lt;code&gt;final&lt;/code&gt; = 运行期只赋值一次（Day 4 系统对比）。&lt;/li&gt;
&lt;li&gt;第 1 课先记住：&lt;strong&gt;照模板加 &lt;code&gt;const&lt;/code&gt; 即可，报错就去掉&lt;/strong&gt;（误区 3）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.5 类、继承与 &lt;code&gt;@override&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   &lt;span class="c1"&gt;// MyApp 继承自 StatelessWidget&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;                              &lt;span class="c1"&gt;// 标注「重写父类方法」&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;   &lt;span class="c1"&gt;// 必须实现 build()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;extends&lt;/code&gt;：继承，和 Java 一样。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StatelessWidget&lt;/code&gt;：&lt;strong&gt;无状态组件&lt;/strong&gt; —— 内容不会自己变化（Hello World 是静态的）。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build(BuildContext context)&lt;/code&gt;：框架调这个方法拿到你要显示的 Widget；&lt;code&gt;@override&lt;/code&gt; 表示你在重写父类的 &lt;code&gt;build&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;🃏 &lt;strong&gt;术语卡：&lt;code&gt;BuildContext context&lt;/code&gt;&lt;/strong&gt; —— &lt;strong&gt;一句话本质&lt;/strong&gt;：「&lt;strong&gt;当前 Widget 在树里的位置&lt;/strong&gt;」的句柄，用它&lt;strong&gt;向上&lt;/strong&gt;找祖先（&lt;code&gt;Xxx.of(context)&lt;/code&gt;）。&lt;strong&gt;常见误解&lt;/strong&gt;：❌「context 是全局的 / 属于 MaterialApp 里面的东西」→ 不，&lt;strong&gt;context 属于「写这段 build 的那个 Widget/Element」&lt;/strong&gt;，&lt;code&gt;of()&lt;/code&gt; 只朝树根方向找、不往下看（Day 8 会专门做三层对照实验）。今天只需知道「这是框架传给你的环境信息」。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;super.key&lt;/code&gt;：把 &lt;code&gt;key&lt;/code&gt; 参数直接转交给父类构造函数（Dart 3 语法）。&lt;code&gt;key&lt;/code&gt; 的用途见 §一-3 的源码印证（Day 32 深挖）。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 与 &lt;code&gt;StatelessWidget&lt;/code&gt; 对应的是 &lt;code&gt;StatefulWidget&lt;/code&gt;（有状态组件），界面需要随交互变化时用。&lt;strong&gt;这是 Day 10 的核心&lt;/strong&gt;，今天先记住有这两大类。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6.6 级联调用 &lt;code&gt;..&lt;/code&gt;（本 App 未用，但你在 &lt;code&gt;runApp&lt;/code&gt; 源码里已经见到了）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 不用级联：写三行、重复三次变量名&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StringBuffer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' World'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 用级联 ..：只写一次变量名，连续调用&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StringBuffer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' World'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;..&lt;/code&gt; 的作用：&lt;strong&gt;对同一个对象连续调用多个方法，不用反复写对象名&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;你今天已经见过真实用例&lt;/strong&gt;：&lt;code&gt;binding.dart:1950-1952&lt;/code&gt; 的 &lt;code&gt;binding..scheduleAttachRootWidget(app)..scheduleWarmUpFrame();&lt;/code&gt; —— 读 SDK 源码时认出它，就不会以为是什么神秘语法。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.7 &lt;code&gt;import&lt;/code&gt; 导入语句
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;和 Python/Java 的 &lt;code&gt;import&lt;/code&gt; 类似，引入外部库。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;package:flutter/material.dart&lt;/code&gt; 是 Flutter 的 Material 组件库，&lt;strong&gt;几乎每个 Flutter 文件第一行都是它&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  七、项目结构说明
&lt;/h2&gt;

&lt;p&gt;创建一个 Flutter 项目后，最重要的几个文件/目录：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_app/
├── lib/                 ← ★ 你写代码的地方（核心）
│   └── main.dart        ← 程序入口，Hello World 全在这里
├── pubspec.yaml         ← ★ 项目的「配置清单/购物清单」
├── android/             ← Android 原生工程（一般不用改）
├── ios/                 ← iOS 原生工程（一般不用改）
├── macos/               ← macOS 桌面工程（你跑 flutter run -d macos 用它）
├── test/                ← 单元测试目录
└── analysis_options.yaml← 代码检查规则
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.1 &lt;code&gt;lib/main.dart&lt;/code&gt; —— 程序入口文件
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flutter &lt;strong&gt;约定&lt;/strong&gt;：App 启动时自动执行 &lt;code&gt;lib/main.dart&lt;/code&gt; 里的 &lt;code&gt;main()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Hello World 的&lt;strong&gt;全部代码都写在 &lt;code&gt;main.dart&lt;/code&gt;&lt;/strong&gt; 里。&lt;/li&gt;
&lt;li&gt;App 变大后会把不同页面拆成 &lt;code&gt;lib/&lt;/code&gt; 下多个 &lt;code&gt;.dart&lt;/code&gt; 文件，但&lt;strong&gt;入口永远是 &lt;code&gt;main.dart&lt;/code&gt;&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;你的实操习惯提醒&lt;/strong&gt;：改完代码必须 &lt;code&gt;flutter run -d macos&lt;/code&gt; &lt;strong&gt;重新构建&lt;/strong&gt;，别双击 &lt;code&gt;build/&lt;/code&gt; 目录里的 &lt;code&gt;.app&lt;/code&gt; 产物（会看到旧构建版本/黑屏）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 &lt;code&gt;pubspec.yaml&lt;/code&gt; —— 项目配置清单
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flutter 项目的&lt;strong&gt;核心配置文件&lt;/strong&gt;（YAML 格式，类似 Python 的 &lt;code&gt;requirements.txt&lt;/code&gt; / Node 的 &lt;code&gt;package.json&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;声明三件事：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;依赖的第三方包&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;网络请求加 &lt;code&gt;http&lt;/code&gt;，存数据加 &lt;code&gt;shared_preferences&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;项目元信息&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;项目名、描述、版本号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;静态资源&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;图片、字体等 &lt;code&gt;assets:&lt;/code&gt; 声明（&lt;strong&gt;Day 6&lt;/strong&gt; 图片会用到）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_app&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;我的第一个 Flutter 应用&lt;/span&gt;
&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=3.0.0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;4.0.0'&lt;/span&gt;
&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;
&lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;uses-material-design&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="c1"&gt;# assets:            # Day 6 加载图片时在这里声明&lt;/span&gt;
  &lt;span class="c1"&gt;#   - assets/images/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 今天&lt;strong&gt;不需要改 &lt;code&gt;pubspec.yaml&lt;/code&gt;&lt;/strong&gt;（Hello World 不用第三方包和资源）。但要知道：以后每加一个库、每加一张图，都要回这里登记，改完通常要 &lt;code&gt;flutter pub get&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7.3 ⚠️ macOS 构建的坑（2026-09-14 实测，你新建项目必踩）
&lt;/h3&gt;

&lt;p&gt;本机 Xcode 27.0 要求 macOS 部署目标 ≥ 12.0，而 &lt;code&gt;flutter create&lt;/code&gt; 模板仍写 &lt;code&gt;10.15&lt;/code&gt; ⇒ &lt;strong&gt;新项目一跑 &lt;code&gt;flutter run -d macos&lt;/code&gt; 就 &lt;code&gt;BUILD FAILED&lt;/code&gt;&lt;/strong&gt;，报错含：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The macOS deployment target 'MACOSX_DEPLOYMENT_TARGET' is set to 10.15,
but the range of supported deployment target versions is 12.0 to 27.0.x.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;修法&lt;/strong&gt;（一条命令，改 &lt;code&gt;project.pbxproj&lt;/code&gt; 里 3 处）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash /Volumes/external/learning/flutter-learning/shared/tools/fix_macos_deploy_target.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;你 Day 1-8 + exam1 的项目都已修过。&lt;strong&gt;新建任何 Flutter 项目后必须跑一次这个脚本&lt;/strong&gt; —— 报 "Build process failed" 时先查这条，别怀疑自己的 Dart 代码。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  八、明确欠账（没讲透 / 没验证的）
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;三棵树（Widget / Element / RenderObject）只认了脸&lt;/strong&gt;：今天只讲「Widget 是配置、要 createElement 充气成 Element」，&lt;strong&gt;没讲三层各自职责、怎么联动、mount/inflate 流程&lt;/strong&gt;。⇒ &lt;strong&gt;留 Day 33 系统化&lt;/strong&gt;（⚠️ 这是你周考口述 Q3 只拿 1.5/7 的重点欠账，Day 33 必须补到能口述）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;帧流程（layout → paint → 光栅化）完全没讲&lt;/strong&gt;：&lt;code&gt;scheduleWarmUpFrame&lt;/code&gt; 之后发生什么、一帧怎么画出来 —— 今天只到「调度一帧」。⇒ Day 2 讲约束三步、Day 33 讲完整管线。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;WidgetsFlutterBinding&lt;/code&gt; / &lt;code&gt;wrapWithDefaultView&lt;/code&gt; 没展开&lt;/strong&gt;：&lt;code&gt;binding.dart:1884-1885&lt;/code&gt; 两个调用只说了「初始化绑定」「包进默认 View」，&lt;strong&gt;没读它们内部&lt;/strong&gt;。今天不需要。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Theme&lt;/code&gt; / &lt;code&gt;themeData.scaffoldBackgroundColor&lt;/code&gt; 刻意不深入&lt;/strong&gt;：&lt;code&gt;scaffold.dart:3237&lt;/code&gt; 出现了主题取值，但&lt;strong&gt;主题系统留 Day 35&lt;/strong&gt;（那天顺带清你 Day 2 的 ARGB 欠账）。今天所有颜色一律直接指定。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;StatefulWidget&lt;/code&gt; / &lt;code&gt;setState&lt;/code&gt; 完全没讲&lt;/strong&gt;：只说了「有这两大类」。⇒ &lt;strong&gt;Day 10&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;const&lt;/code&gt; 的性能收益未实测&lt;/strong&gt;（误区 3 已标注）⇒ Day 10 用真实重建场景验证。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;书原文未逐章 &lt;code&gt;ov read&lt;/code&gt; 核对&lt;/strong&gt;：机制部分全部来自本机 SDK 3.44.0 &lt;strong&gt;磁盘逐字读出&lt;/strong&gt;；①ch9 / ⑦ch1-2 / ②ch1 / ⑨ / ⑪ 章节用于定位对照，本次未逐章跑全文。&lt;strong&gt;诚实欠账&lt;/strong&gt; —— 书与本笔记冲突时以 SDK 源码为准，并告诉导师去核书。&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  九、诊断视角（Hello World 阶段就会用到的排查手段）
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;白屏&lt;/strong&gt;：查 &lt;code&gt;main()&lt;/code&gt; 里有没有 &lt;code&gt;runApp(...)&lt;/code&gt;（误区 1）。&lt;strong&gt;编译过 ≠ 会渲染。&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;黑屏/文字没底色&lt;/strong&gt;：查有没有 &lt;code&gt;Scaffold&lt;/code&gt;（误区 2）—— 背景色来自 &lt;code&gt;scaffold.dart:3236&lt;/code&gt; 那层 Material。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;文字贴左上角&lt;/strong&gt;：漏了 &lt;code&gt;Center&lt;/code&gt;（§4.6）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;右上角有 "DEBUG" 标签&lt;/strong&gt;：正常，&lt;code&gt;debugShowCheckedModeBanner: false&lt;/code&gt; 可关。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;flutter run&lt;/code&gt; 报 BUILD FAILED（macOS）&lt;/strong&gt;：部署目标问题，跑 &lt;code&gt;fix_macos_deploy_target.sh&lt;/code&gt;（§7.3），&lt;strong&gt;不是你的 Dart 代码错&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;flutter run&lt;/code&gt; 的常用热键&lt;/strong&gt;（今天先认两个）：

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;r&lt;/code&gt;&lt;/strong&gt; = 热重载（改代码后快速刷新，&lt;strong&gt;保留状态&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;R&lt;/code&gt;&lt;/strong&gt; = 热重启（重建整个 App，&lt;strong&gt;丢状态&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;改了 &lt;code&gt;main()&lt;/code&gt;、&lt;code&gt;pubspec.yaml&lt;/code&gt;、或类结构，热重载常常不生效 ⇒ 用 &lt;code&gt;R&lt;/code&gt; 或直接重跑&lt;/strong&gt;。你「看到旧版本」的很多情况就是只按了 &lt;code&gt;r&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p&lt;/code&gt; = 给盒子涂色 + 画尺寸箭头（Day 2 起会大量用，开关本体 &lt;code&gt;rendering/debug.dart:36&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;flutter analyze&lt;/code&gt;&lt;/strong&gt;：查语法/规范问题（误区 3 的 const 错、误区 6 的 children 错它都能抓）。&lt;strong&gt;但查不出白屏/黑屏&lt;/strong&gt;（那些是运行期/视觉问题）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;debugDumpApp()&lt;/code&gt;&lt;/strong&gt;（&lt;code&gt;widgets/binding.dart:1972-1974&lt;/code&gt;）：控制台打印整棵 Widget 树 —— &lt;strong&gt;今天就能用&lt;/strong&gt;，看看你的 Hello World 到底被 inflate 成了多少层（会看到一长串你没写过的组件，那就是 §一-2 说的「充气」结果）。&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  十、今日自测（你 2026-08-13 已作答 · 原文保留 + 导师批改）
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;main()&lt;/code&gt; 里少了 &lt;code&gt;runApp()&lt;/code&gt; 会发生什么？为什么？&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;会无法起动，要有runApp()才会启动，说白了， 就是页面只是一个静态的函数，未交给runApp进行初始化的加载&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ &lt;strong&gt;对，而且「未交给 runApp 进行初始化的加载」这个表述抓到本质了&lt;/strong&gt;。&lt;strong&gt;L3 补充（源码级）&lt;/strong&gt;：&lt;code&gt;runApp&lt;/code&gt; 只有 3 行（&lt;code&gt;binding.dart:1883-1886&lt;/code&gt;），关键是 &lt;code&gt;_runWidget&lt;/code&gt; 里的 &lt;code&gt;scheduleAttachRootWidget(app)&lt;/code&gt;（挂载根 widget）+ &lt;code&gt;scheduleWarmUpFrame()&lt;/code&gt;（调度第一帧）（&lt;code&gt;:1951-1952&lt;/code&gt;）—— &lt;strong&gt;没人调度帧，屏幕就永远空白&lt;/strong&gt;。而 &lt;code&gt;MyApp()&lt;/code&gt; 只是造了个配置对象（图纸），没被「充气」进树。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;MaterialApp&lt;/code&gt; 和 &lt;code&gt;Scaffold&lt;/code&gt; 各管什么？一个 App 里有几个 &lt;code&gt;MaterialApp&lt;/code&gt;？&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;materialapp是指我这个项目，要使用什么风格&lt;br&gt;
scaffold则是在home下提供背景色&lt;br&gt;
一个app里面只有一个materalapp&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ 三句都对（「一个 App 只有一个 MaterialApp」尤其准）。&lt;strong&gt;L3 补充&lt;/strong&gt;：① MaterialApp 是 &lt;strong&gt;StatefulWidget&lt;/strong&gt;（&lt;code&gt;app.dart:217&lt;/code&gt;），管主题/路由/本地化等&lt;strong&gt;全局&lt;/strong&gt;事务；② Scaffold「提供背景色」的机制 = 它内部包了一层 &lt;strong&gt;Material&lt;/strong&gt;（&lt;code&gt;scaffold.dart:3236-3237&lt;/code&gt;），&lt;strong&gt;这层 Material 还是 Day 7 按钮水波纹的画布&lt;/strong&gt; —— 所以 Scaffold 白送的不只是背景色；③ ⚠️ 但 &lt;strong&gt;MaterialApp 自己不含 Material/Scaffold&lt;/strong&gt;，所以在 &lt;code&gt;MyApp.build&lt;/code&gt; 里调 &lt;code&gt;ScaffoldMessenger.of(context)&lt;/code&gt; 会崩（Day 8 你实战踩过）。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;为什么 &lt;code&gt;Colors.grey[600]&lt;/code&gt; 不能放进 &lt;code&gt;const&lt;/code&gt; 里？&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;因为colors.grey是计算值，而const是确定的值&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ 方向对。&lt;strong&gt;精确化&lt;/strong&gt;：&lt;code&gt;Colors.grey&lt;/code&gt; 本身&lt;strong&gt;是常量&lt;/strong&gt;（&lt;code&gt;MaterialColor&lt;/code&gt; 常量对象），问题在 &lt;strong&gt;&lt;code&gt;[600]&lt;/code&gt; 是调用它的 &lt;code&gt;[]&lt;/code&gt; 运算符 = 运行时方法调用&lt;/strong&gt; ⇒ 编译期算不出值。同理 &lt;code&gt;.shade600&lt;/code&gt;（getter）也不行。→ §五 误区 3。&lt;strong&gt;这条你 Day 2、Day 5 又各踩一次，是高频坑。&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;想让文字显示在屏幕正中央，需要哪个 Widget 包着 &lt;code&gt;Text&lt;/code&gt;？&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;要用center进行包裹，center下面装childen然后在装text&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ 组件对（Center）。&lt;strong&gt;两处要纠正&lt;/strong&gt;：① 参数名是 &lt;strong&gt;&lt;code&gt;child&lt;/code&gt;（单数）&lt;/strong&gt;，不是 &lt;code&gt;children&lt;/code&gt; —— Center 是单子布局组件（写 &lt;code&gt;children&lt;/code&gt; 会编译错「No named parameter」，误区 6）；② 正确写法 &lt;code&gt;Center(child: Text('...'))&lt;/code&gt;。&lt;br&gt;
   &lt;strong&gt;L3 补充&lt;/strong&gt;：Center 的源码只有 4 行（&lt;code&gt;basic.dart:2550-2553&lt;/code&gt;），它继承 &lt;code&gt;Align&lt;/code&gt; 且 Align 的 &lt;code&gt;alignment&lt;/code&gt; 默认就是 &lt;code&gt;Alignment.center&lt;/code&gt;（&lt;code&gt;:2468&lt;/code&gt;）—— &lt;strong&gt;想居左上角就得改用 &lt;code&gt;Align&lt;/code&gt;&lt;/strong&gt;（Center 没暴露这个参数）。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;你写的 Dart 代码放在哪个目录、哪个文件里？&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;放在lib里面，测试放在test文件夹里面，an开头是语法检测配置，pub则是项目管理配置，其他的就是各大平台的一些配置&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ &lt;strong&gt;全对&lt;/strong&gt;，而且能说出 &lt;code&gt;analysis_options.yaml&lt;/code&gt; 和 &lt;code&gt;pubspec.yaml&lt;/code&gt; 各自的角色，说明项目结构真看懂了。补一条：&lt;strong&gt;入口永远是 &lt;code&gt;lib/main.dart&lt;/code&gt;&lt;/strong&gt;（Flutter 的约定）。&lt;/p&gt;




&lt;h2&gt;
  
  
  十一、学后自查题（先过这关再写练习 · 答案不内嵌）
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;用法：&lt;strong&gt;合上笔记&lt;/strong&gt;凭记忆作答，做完发导师批改。💎 题要求指到源码行号。&lt;br&gt;
参考答案不在本笔记（导师侧：&lt;code&gt;flutter-learning/shared/solutions/day1/day1_自查题参考答案.md&lt;/code&gt;，作答后解锁）。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;L1/L2 基础&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;一个最小可运行的 Flutter App 需要哪几层组件？从外到内按顺序写出来。〔回看 §四 完整代码〕&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MaterialApp&lt;/code&gt; 的 &lt;code&gt;title&lt;/code&gt; 和 &lt;code&gt;AppBar&lt;/code&gt; 的 &lt;code&gt;title&lt;/code&gt; 有什么区别？各自显示在哪？〔回看 §4.3、误区 4〕&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Center&lt;/code&gt; 的参数是 &lt;code&gt;child&lt;/code&gt; 还是 &lt;code&gt;children&lt;/code&gt;？为什么？〔回看 误区 6〕&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flutter run&lt;/code&gt; 里 &lt;code&gt;r&lt;/code&gt; 和 &lt;code&gt;R&lt;/code&gt; 分别是什么？改完代码看到「还是旧界面」该怎么办？〔回看 §九-6〕&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💎 L3 深挖（口述机制 + 指得到源码行号；答不全 → 记 weak_points）&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;runApp(const MyApp())&lt;/code&gt; 这一行，框架内部做了哪几件事？&lt;/strong&gt;（要说出至少 3 步 + 源码文件:行号）&lt;strong&gt;为什么忘了它屏幕就白屏、但编译不报错？&lt;/strong&gt;〔回看 §4.2、误区 1〕&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;为什么说「Widget 不是界面」？&lt;/strong&gt; 请给出源码依据（Widget 的构造函数有什么特征？那个抽象方法叫什么、返回什么类型？）。官方文档用哪个动词描述「Widget 进树」的过程？〔回看 §一-2 术语卡 1〕&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Center&lt;/code&gt; 的源码一共几行？它为什么能居中？&lt;/strong&gt;（要说出它继承谁、那个默认值在哪一行、以及「想居左上角该怎么办」）〔回看 §4.6〕&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Scaffold&lt;/code&gt; 除了背景色，还白送了什么一层？源码在哪一行？这一层在 Day 7 会变成什么的关键？&lt;/strong&gt; 再回答：&lt;code&gt;AppBar&lt;/code&gt; 是靠实现哪个接口让 Scaffold 认出「我是顶部栏、给我留高度」的？〔回看 §4.4、§4.5〕&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ 全过 → 开始练习；答不全 → 先补那个点。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  十二、边界对比（近邻概念 A vs B）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;MaterialApp&lt;/code&gt; vs &lt;code&gt;Scaffold&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;MaterialApp&lt;/th&gt;
&lt;th&gt;Scaffold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;管什么&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;整个 App&lt;/strong&gt; 的全局规则（主题/路由/本地化）&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;单个页面&lt;/strong&gt;的骨架（appBar/body/drawer 槽位）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数量&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;一个 App 只有一个&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;每页一个（可多个）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自带 Material 层吗&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;❌ 不含&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 含（&lt;code&gt;scaffold.dart:3236&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型&lt;/td&gt;
&lt;td&gt;StatefulWidget（&lt;code&gt;app.dart:217&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;StatefulWidget（&lt;code&gt;scaffold.dart:1686&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;层级&lt;/td&gt;
&lt;td&gt;外层&lt;/td&gt;
&lt;td&gt;必须在 MaterialApp 的 home/路由&lt;strong&gt;里面&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;Center&lt;/code&gt; vs &lt;code&gt;Align&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Center&lt;/th&gt;
&lt;th&gt;Align&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;源码&lt;/td&gt;
&lt;td&gt;4 行（&lt;code&gt;basic.dart:2550-2553&lt;/code&gt;），继承 Align&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;basic.dart:2462&lt;/code&gt;，alignment 默认 center（&lt;code&gt;:2468&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;能定位到&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;只能居中&lt;/strong&gt;（没暴露 alignment）&lt;/td&gt;
&lt;td&gt;任意方位（9 个预设 + 自定义）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;何时用&lt;/td&gt;
&lt;td&gt;只居中（最短写法）&lt;/td&gt;
&lt;td&gt;要别的方位&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;StatelessWidget&lt;/code&gt; vs &lt;code&gt;StatefulWidget&lt;/code&gt;（今天只认脸，Day 10 正式学）
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;StatelessWidget&lt;/th&gt;
&lt;th&gt;StatefulWidget&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;内容会变吗&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;不会&lt;/strong&gt;（静物画）&lt;/td&gt;
&lt;td&gt;会（有内部状态）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;今天用到的&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;MyApp&lt;/code&gt;（你自己写的）&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;MaterialApp&lt;/code&gt; / &lt;code&gt;Scaffold&lt;/code&gt; / &lt;code&gt;AppBar&lt;/code&gt;（框架的）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;何时用&lt;/td&gt;
&lt;td&gt;纯展示、配置不变&lt;/td&gt;
&lt;td&gt;需要随交互变化（计数器、表单）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⭐ &lt;strong&gt;有意思的观察&lt;/strong&gt;：你写的 &lt;code&gt;MyApp&lt;/code&gt; 是 Stateless，但它 return 的 &lt;code&gt;MaterialApp&lt;/code&gt;/&lt;code&gt;Scaffold&lt;/code&gt;/&lt;code&gt;AppBar&lt;/code&gt; &lt;strong&gt;都是 StatefulWidget&lt;/strong&gt; —— &lt;strong&gt;「我用的组件有状态」和「我自己写的组件有状态」是两回事&lt;/strong&gt;。今天不需要理解为什么它们是 Stateful，Day 10 会讲。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;Text&lt;/code&gt; vs &lt;code&gt;RichText&lt;/code&gt;（今天只认脸，Day 5 展开）
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Text&lt;/th&gt;
&lt;th&gt;RichText&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;是什么&lt;/td&gt;
&lt;td&gt;语法糖（StatelessWidget）&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;真正干活的&lt;/strong&gt;（MultiChildRenderObjectWidget）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会 merge 默认样式吗&lt;/td&gt;
&lt;td&gt;✅ 会&lt;/td&gt;
&lt;td&gt;❌ 不会&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;何时用&lt;/td&gt;
&lt;td&gt;99% 场景&lt;/td&gt;
&lt;td&gt;几乎不直接用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  十三、一句话总结 + 资源任务卡
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;今日核心一句话&lt;/strong&gt;：Flutter 用 Dart 写「声明式」的 Widget 树，&lt;code&gt;main()&lt;/code&gt; 里调用 &lt;code&gt;runApp()&lt;/code&gt; 启动（3 行源码：初始化绑定 → 包 View → 挂载根 widget + 调度热身帧），&lt;code&gt;MaterialApp&lt;/code&gt; 提供全局环境，&lt;code&gt;Scaffold&lt;/code&gt; 搭建页面骨架（&lt;strong&gt;还白送一层 Material&lt;/strong&gt;），&lt;code&gt;AppBar&lt;/code&gt; / &lt;code&gt;Center&lt;/code&gt; / &lt;code&gt;Text&lt;/code&gt; 组成具体界面 —— &lt;strong&gt;而这一切都只是「配置」，真正进树的是 &lt;code&gt;createElement()&lt;/code&gt; 充气出来的 Element。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;资源任务卡&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[ ] 跑通 Hello World，然后按 &lt;code&gt;p&lt;/code&gt; 看盒子涂色（认识「你写的 4 层，实际渲染出几十层」）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] 在 &lt;code&gt;main()&lt;/code&gt; 里加一行 &lt;code&gt;debugDumpApp();&lt;/code&gt;（放在 &lt;code&gt;runApp&lt;/code&gt; 之后），&lt;strong&gt;亲眼看你的 Widget 被 inflate 成了什么&lt;/strong&gt; —— 这是 §一-2「Widget 是图纸、Element 是房子」的第一次实证&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] &lt;strong&gt;新增（今天的 L3 动作）&lt;/strong&gt;：跑这两条命令，验证「笔记贴的码 == 磁盘的码」&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  python3 /Volumes/external/learning/flutter-learning/shared/tools/verify_inline_code.py &lt;span class="se"&gt;\&lt;/span&gt;
          /Volumes/external/learning/flutter/day1_study.md
  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'1883,1886p'&lt;/span&gt; /opt/homebrew/share/flutter/packages/flutter/lib/src/widgets/binding.dart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;目的&lt;/strong&gt;：亲眼看到 &lt;code&gt;runApp&lt;/code&gt; 只有 3 行 —— L3「能读 SDK 源码验证」的第一次实操。&lt;/p&gt;




&lt;h2&gt;
  
  
  十四、自查清单（按 L3 产出规范逐条打勾）
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;0. 读原文预检&lt;/strong&gt;：机制部分全部来自本机 SDK 3.44.0 &lt;strong&gt;磁盘逐字读出&lt;/strong&gt;（&lt;code&gt;widgets/binding.dart&lt;/code&gt;、&lt;code&gt;widgets/framework.dart&lt;/code&gt;、&lt;code&gt;widgets/basic.dart&lt;/code&gt;、&lt;code&gt;widgets/text.dart&lt;/code&gt;、&lt;code&gt;material/app.dart&lt;/code&gt;、&lt;code&gt;material/scaffold.dart&lt;/code&gt;、&lt;code&gt;material/app_bar.dart&lt;/code&gt;、&lt;code&gt;rendering/shifted_box.dart&lt;/code&gt;）；书章节（①ch9 / ⑦ch1-2 / ②ch1 / ⑨ / ⑪）本次&lt;strong&gt;未逐章 &lt;code&gt;ov read&lt;/code&gt;&lt;/strong&gt; → §八 欠账 7 已诚实标注。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;1. 每个 Widget 有一句话本质&lt;/strong&gt;：Widget(§一-2 术语卡) / runApp(4.2) / MaterialApp(4.3) / Scaffold(4.4) / AppBar(4.5) / Center(4.6) / Text(4.7)。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;2. 每个「为什么」能指到源码行号&lt;/strong&gt;：全文机制断言均标行号；&lt;strong&gt;0 处「书里说」式断言&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;3. 有边界对比&lt;/strong&gt;：§十二 四组（MaterialApp/Scaffold、Center/Align、Stateless/Stateful、Text/RichText）。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;4. ≥3 个坑且写明「为什么会踩」&lt;/strong&gt;：§五 共 6 个误区。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;5. 有可复跑验证&lt;/strong&gt;：§九 8 条诊断动作（含 &lt;code&gt;r&lt;/code&gt;/&lt;code&gt;R&lt;/code&gt;/&lt;code&gt;p&lt;/code&gt; 热键、&lt;code&gt;debugDumpApp&lt;/code&gt;）；§十三 资源任务卡给了可跑命令。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;6. 有口述验收句（机制级）&lt;/strong&gt;：§三 三句，每句标源码行号。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;7. 无答案泄漏&lt;/strong&gt;：§十一 八题只有题干；答案在 &lt;code&gt;shared/solutions/day1/&lt;/code&gt;。§十 是你已提交批改的历史答案。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;8. 有学后自查题&lt;/strong&gt;：§十一 八题（4 基础 + 4 💎 L3），每题带〔回看〕。&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;9. 贴码铁律（2026-09-16 新增）&lt;/strong&gt;：每处 &lt;code&gt;文件:行号&lt;/code&gt; 都配代码块或落对照册；&lt;code&gt;extract_refs.py&lt;/code&gt; 0 处假行号；&lt;code&gt;verify_inline_code.py&lt;/code&gt; 内联码逐字一致；关键源码带中文逐行注释；计数断言当场数过（runApp 函数体 &lt;strong&gt;3 行&lt;/strong&gt;、Center &lt;strong&gt;4 行&lt;/strong&gt;、MaterialApp/Scaffold 均为 StatefulWidget）。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;超纲自查&lt;/strong&gt;：本笔记未教 Container/Padding/SizedBox（Day 2）、Card/Expanded/SafeArea/SCSV（Day 3）、GestureDetector/Stack/Positioned（Day 4）、Text 样式深化/TextSpan（Day 5，§4.7 明确标注「Day 5 整节展开」）、Image/Icon（Day 6）、Buttons（Day 7）、Row/Column（Day 8）、ListView（Day 9）、setState/StatefulWidget 生命周期（Day 10，只认脸）、Theme/ColorScheme（Day 35，§八 欠账 4 说明为何刻意不深入）、三棵树系统化（Day 33，§八 欠账 1）。代码示例无自定义函数/箭头函数（Day 4 才补）。颜色一律直接指定。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;笔记完 · 下一课：Day 2「容器与单子布局基础」（Container / Padding / SizedBox / Center + *&lt;/em&gt;约束三步对话** —— 整个 Flutter 布局的地基）。*&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
