Flutter基础概念完全指南

🎯 什么是Flutter?

想象一下,如果你要建造一座房子,传统的方式是为不同的房间(iOS、Android、Web)分别设计和建造。而Flutter就像是一个神奇的建筑工具,让你只需要设计一次,就能同时建造出适合所有平台的房子。

Flutter是Google开发的UI工具包,用于从单一代码库构建漂亮的、原生编译的移动、Web和桌面应用程序。

Flutter的核心优势

  • 一次编写,到处运行:就像万能钥匙,一把钥匙开所有门
  • 热重载:就像魔法,代码改动立即生效
  • 高性能:直接编译成原生代码,性能接近原生应用
  • 丰富的UI组件:就像乐高积木,各种组件任你组合

🧱 第一章:Widget概念理解

在这里插入图片描述

1.1 一切皆Widget的思想

在Flutter中,一切都是Widget!这就像在现实世界中,一切都是由原子组成的一样。

// 想象Widget就像搭积木
// 每个积木块都是一个Widget
// 大的积木可以包含小的积木

// 一个简单的应用就是这样组成的:
MyApp (最大的积木)
├── MaterialApp (应用框架积木)
    └── Scaffold (页面结构积木)
        ├── AppBar (顶部栏积木)
        └── Body (主体积木)
            └── Text (文字积木)

1.2 Widget就像现实中的物品

让我们用现实生活中的例子来理解Widget:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '我的第一个Flutter应用',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      // AppBar就像房子的屋顶
      appBar: AppBar(
        title: Text('欢迎来到Flutter世界'),
        backgroundColor: Colors.blue,
      ),
      
      // Body就像房子的主体部分
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // Text就像房间里的标语牌
            Text(
              '你好,Flutter!',
              style: TextStyle(
                fontSize: 24,
                fontWeight: FontWeight.bold,
                color: Colors.blue,
              ),
            ),
            
            SizedBox(height: 20), // 就像两个家具之间的空隙
            
            // Icon就像装饰品
            Icon(
              Icons.favorite,
              color: Colors.red,
              size: 50,
            ),
          ],
        ),
      ),
    );
  }
}

1.3 StatelessWidget vs StatefulWidget

这就像现实中的静态物品动态物品的区别:

StatelessWidget - 静态物品

就像一幅画、一个雕塑,一旦创建就不会改变:

// 就像一个永远不变的标语牌
class WelcomeSign extends StatelessWidget {
  final String message;
  
  WelcomeSign({required this.message});
  
  
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(16),
      decoration: BoxDecoration(
        color: Colors.blue[100],
        borderRadius: BorderRadius.circular(8),
      ),
      child: Text(
        message,
        style: TextStyle(
          fontSize: 18,
          fontWeight: FontWeight.bold,
        ),
      ),
    );
  }
}
StatefulWidget - 动态物品

就像一个时钟、一个开关,状态会发生变化:

// 就像一个可以开关的灯
class ToggleLight extends StatefulWidget {
  
  _ToggleLightState createState() => _ToggleLightState();
}

class _ToggleLightState extends State<ToggleLight> {
  bool isLightOn = false; // 灯的状态:开或关
  
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 灯泡图标,根据状态显示不同颜色
        Icon(
          Icons.lightbulb,
          size: 100,
          color: isLightOn ? Colors.yellow : Colors.grey,
        ),
        
        SizedBox(height: 20),
        
        // 开关按钮
        ElevatedButton(
          onPressed: () {
            setState(() {
              isLightOn = !isLightOn; // 切换灯的状态
            });
          },
          child: Text(isLightOn ? '关灯' : '开灯'),
        ),
        
        // 状态文字
        Text(
          '灯现在是${isLightOn ? "开着的" : "关着的"}',
          style: TextStyle(fontSize: 16),
        ),
      ],
    );
  }
}

1.4 Widget树的概念

Widget树就像家族族谱,每个Widget都有自己的父母和孩子:

// 想象这是一个家庭结构
MaterialApp (爷爷)
└── Scaffold (爸爸)
    ├── AppBar (大儿子)
    │   └── Text (孙子)
    └── Body (二儿子)
        └── Column (孙子)
            ├── Text (曾孙)
            ├── Icon (曾孙)
            └── Button (曾孙)

实际代码示例:

class FamilyTreeExample extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp( // 爷爷级别
      home: Scaffold( // 爸爸级别
        appBar: AppBar( // 大儿子
          title: Text('家族树示例'), // 孙子
        ),
        body: Column( // 二儿子
          children: [ // 孙子们
            Text('我是第一个孙子'), // 曾孙1
            Icon(Icons.family_restroom), // 曾孙2
            ElevatedButton( // 曾孙3
              onPressed: () {},
              child: Text('我是按钮'),
            ),
          ],
        ),
      ),
    );
  }
}

每篇文章并不长,这个系列是由浅到深来设计的。如果文章对您有帮助,麻烦动动发财的小手点赞、关注和收藏,您的反馈将是作者不断更新的动力🙏🏻

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐