【学习 Flutter】将页面渲染到设备

在挂载页面之前先讨论一个 Flutter 里的关键概念组件

组件

Flutter is all about widgets

Flutter 的一个重要概念:组件,组件就像一块块的积木(用于嵌套构建成用户所看到的界面)

所有都是组件
  • 整个 app 是一个组件
  • 页面是一个组件
  • 组件可以包含着其他组件
  • 组件不单只负责显示,也同时会有逻辑(比如按钮一般会包含事件)

因此如何将 Flutter 应用挂到不同平台上这种繁琐工作并不需要开发者关心,需要关心的是如何利用 Flutter 提供的组件去组合我们的界面与实现业务逻辑

你可以认为 Flutter 应用就是一个组件树

  • 有一个根组件包裹着整个 app
  • 页面与页面之间是一个个不同的组件且可相互跳转
  • 嵌套组件列表组件、用户表单组件等等
组件树

创建第一个组件

整个 Flutter 就是通过组件构建而成,因此我们来创建第一个组件

Flutter 中的组件可以被继承,此处有两个 dart 的关键字

class —— 面向对象语言(OOP)中 '类' 的概念
  • 在 OOP 中所有都是对象
  • 对象简单而言是一个数据组织方案(数据结构)
  • 类允许你为对象创建的蓝图(里面有什么,可以做什么)

Classes are used to create objects - they serve as blueprint for objects.

  • Flutter 里自带了不少类,同时我们需要创建自己的类
  • 类的命名规则,首字母必须大写,多词可使用词首字母大写方式
  • 可为类添加两种特征
    • 属性(Property)
    • 动作(Method)
extends —— 面向对象语言中 '继承' 的概念

Flutter 中的组件有特定的功能来将组件内容渲染到设备里,因此需要将我们自己编写的类继承 Flutter 中的组件类,以获得对应的能力

继承的组件类来自于 Flutter,因此需要导入 Flutter 包(dart 是模块化语言,意味着可以按模块进行加载)

import 'package:flutter/material.dart'; // 导入 Flutter 包下的 material 文件

// 继承导入 Flutter 包中的组件类
class MyApp extends StatelessWidget {
}

实现 build 方法

在 VS Code 里会发现 MyApp 下会出现红色波浪线,鼠标移动到该出会出现提示需要实现 build 方法

VS Code 提示,需要实现 build 方法

为何需要实现 build 方法,因 Flutter 需要调用组件中的 build 方法将内容渲染到设备中

3 种方法实现:
  • 输入 build -> 按下 tab 或回车,VS Code 会自动为我们补全代码
  • 上图 IDE 提示的 Quick Fix... -> Create 1 missing override
  • 全手动输入
Widget build(BuildContext context) {
  return null;
}
一条重要的规则:一个组件必须在 build 方法中返回另一个组件

在这里我们使用 Flutter 里的组件 MaterialApp

  • 用于包装整个应用的特殊组件,定义整个 app 的结构风格,包含导航,主题设定等等功能
  • 每个页面上都会使用到的核心根组件
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(); // 注意这里必须带括号,因为这里创建了 MaterialApp 的对象
  }
}
MaterialApp

MaterialApp 组件可通过具名参数(非位置参数)方式定义这个组件的结构与风格

具名参数:指该参数是带有指定名字,参数与参数间顺序无关
位置参数:指该参数是没有指定名字,受其位置决定

构造器需要什么参数可通过鼠标移动查看
  • 参数名 home:是指当 app 加载后显示的第一个页面(组件),常用的值是 Scaffold
  • 组件 Scaffold:为应用创建一个新的白色页,同时可以加上 app bar(应用顶栏)等等
  • 参数名 appBar:Flutter 提供了常用的应用顶栏,这里我们选用 AppBar
  • 组件 AppBar:提供 title 参数,指一般为 Text 组件

文字难以描述关系,参考代码结构更为直观:

class MyApp extends StatelessWidget { // 最顶层的自定义根组件
  @override
  Widget build(BuildContext context) {
    return MaterialApp( // 这个是 material 包裹的应用
      home: Scaffold( // 一个可以设置页面结构的白色页面
        appBar: AppBar( // 应用顶栏
          title: Text('Hello world'), // 文字内容,这个字符串参数就属于位置参数
        ),
      ),
    );
  }
}

你会发现,所有的值都是组件。印证了 Flutter 官网的

The core of Flutter’s layout mechanism is widgets. In Flutter, almost everything is a widget—even layout models are widgets.

挂载界面到设备

最终挂载我们的根组件到 main 方法中,再运行我们的 Flutter 应用,就可以在模拟器上看到,我们的第一个 Hello world 应用

'main.dart'

import 'package:flutter/material.dart';

void main() {
  print('hello world');
  runApp(MyApp()); // 挂载我们的自定义根组件到 main 方法中
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Hello world'),
        ),
      ),
    );
  }
}
挂载到界面上的 Hello World

最终真正意义上的第一个 Hello World 已经在虚拟机上显示出来,接下来我们将继续学习更多的 Flutter 知识。

At the end of this part:"Every thing is widget in Flutter."
See you soon.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容