#02 Flutter 之 Hello Word 剖析

425 阅读3分钟

新建 Hello Word 项目

cd /Users/gaoshuaipeng/learn/flutter/MasterFlutter
flutter create HelloWord
cd HelloWord

运行项目

基于 Android 系统

查看否有 设备或模拟器可用:

adb devices
List of devices attached

启动一个 Android 模拟器:

通过 Android Studio 打开 AVD Manager

第一步:

第二步:

第三步:

再查看否有设备或模拟器可用:

(base) ➜  MasterFlutter adb devices
List of devices attached
emulator-5554	device

现在我们可以运行我们的 Hello World了:

(base) ➜  HelloWord flutter run
Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!
Downloading ios tools...                                            8.1s
Downloading ios-profile tools...                                    5.4s
Downloading ios-release tools...                                   37.8s
More than one device connected; please specify a device with the '-d
<deviceId>' flag, or use '-d all' to act on all devices.

Android SDK built for x86 • emulator-5554                        •
android-x86 • Android 10 (API 29) (emulator)
iPhone Xʀ                 • F693B8A2-4007-404D-90F6-9729849691C2 • ios
• com.apple.CoreSimulator.SimRuntime.iOS-12-4 (simulator)

提示我运行失败,原因是有不止一个设备处于连接状态。

解决方式:

  1. 关闭 iPhone Xʀ 模拟器
  2. 添加 -d all 参数,在所有设备上都运行
  3. 添加 -d deviceid 参数,在某个设备上运行

我选择方法3:

flutter run -d emulator-5554

如果了解过Android开发的话,这个过程有个核心 task: assembleDebug。

flutter 会在这任务前后做些别的任务,来支持如下命令

Flutter run key commands.
r Hot reload. 🔥🔥🔥
R Hot restart.
h Repeat this help message.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).

运行结果:

一个小任务

去掉右上角的 Debug 图标

lib/main.dart

添加 debugShowCheckedModeBanner: false,

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

增强版小任务

根据 flutter.dev/docs/get-st… 教程,完成一个App。

项目文件分析

(base) ➜  HelloWord tree -L 1
├── [ 128]  .dart_tool
├── [ 722]  .gitignore
├── [ 256]  .idea
├── [ 302]  .metadata
├── [2.1K]  .packages
├── [ 896]  HelloWord.iml
├── [ 539]  README.md
├── [ 416]  android
├── [ 128]  build
├── [ 224]  ios
├── [  96]  lib
├── [3.2K]  pubspec.lock
├── [2.8K]  pubspec.yaml
└── [  96]  test

核心文件(夹): pubspec.yaml 、lib、 ios、android、test

pubspec.yaml

类似 Node.js 的 package.json。这个文件需要好好看看。

lib/main.dart

业务的入库文件。

核心代码:

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

是不是有 C、JAVA的既视感?

语言的语法只是外形。

类似 Android 原生 Application 的代码:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

这很好地反应的 Dart语言的特性:OO。迅速把你学过的 OO型的编程语言的核心知识调取出来。继承、封装、多态等。基本上 Dart语言你已经学会了一半了。

继续看首页的业务代码:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

是不是看着很怪,甚至有点恶心。但是没关系,大部分的代码风格其实已经是最优设计了。

在回看一下,你发现没有 MyApp、MyHomePage 都是继承 XXXWidget的。猜想一下,是不是说 MyApp、MyHomePage 有可能 都是一类东西:Widget。

abstract class StatefulWidget extends Widget {
  ...
    
    
abstract class StatelessWidget extends Widget {
  ...

现在对于 Widget 的学习,其实你已经学会了一半了,但是好像一个具体的 Widget 也没有学习啊。是的,但是你已经学习了所有类型的 Widget: StatefulWidget + StatelessWidget 的具体语法。

如果不放心的话,在页面上放一句话:我学会了 Flutter,字条调为红色。

如下图:

代码

链接: pan.baidu.com/s/1qRxN4pxh… 密码:5p4f