3.2、Flutter:概述

一、概述

Flutter实战

二、一切都是Widget

在Flutter架构中,一切都是组件。
1、所有的页面View、按钮Button、列表List、手势Gesture(按钮点击、双击、缩放等)都是以组件的方式提供;
2、iOS/Android中的页面布局,也是组件方式支持,提供布局组件(如Flex、线性布局、位置布局等) 和 容器布局(Margin、Pading、裁剪、变换等),包裹子组件从而实现页面的自定义布局。

2.1、组件

无状态 StatelessWidget、有状态 StatefulWidget、状态 State。

  • 一个 StatefulWidget 至少包含 StatelessWidget 和 State 类。

  • 为什么要将build方法放在State中,而不是放在StatefulWidget中?
    这主要是为了提高开发的灵活性。
    如果将build()方法放在StatefulWidget中则会有两个问题:1、状态访问不便。2、继承StatefulWidget不便。

2.2、路由(管理页面的跳转)

无论是Android还是iOS,导航管理都会维护一个路由栈,路由入栈(push)操作对应打开一个新页面,路由出栈(pop)操作对应页面关闭操作,而路由管理主要是指如何来管理路由栈。

  • MaterialPageRoute -> PageRoute
    PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,它还定义了路由构建及切换时过渡动画的相关接口及属性。
    MaterialPageRoute 是Material组件库提供的组件,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画。
MaterialPageRoute({
    WidgetBuilder builder,  // 一个WidgetBuilder类型的回调函数,它的作用是构建路由页面的具体内容,返回值是一个widget。
    RouteSettings settings, //配置信息,如路由名称、是否初始路由
    bool maintainState = true, // 是否常驻内存,默认true
    bool fullscreenDialog = false, // 是否全屏模式
  })
  • Navigator
    一个路由管理的组件,它提供了打开和退出路由页方法。Navigator通过一个栈来管理活动路由集合。
    Future push(BuildContext context, Route route)
    bool pop(BuildContext context, [ result ])

2.3、路由传值

  • 非命名传递
    Navigator.pop(context, "参数")
    通过等待Navigator.push(…)返回的Future来获取新路由的返回数据,使用async / await 机制。

  • “命名路由”(Named Route)即有名字的路由
    1、注册路由表(routing table):Map<String, WidgetBuilder> routes;
    2、跳转:Future pushNamed(BuildContext context, String routeName,{Object arguments})
    3、获取参数:var args=ModalRoute.of(context).settings.arguments;

  • 路由生成钩子
    MaterialApp有一个onGenerateRoute属性,它在打开命名路由时可能会被调用,之所以说可能,是因为当调用Navigator.pushNamed(...)打开命名路由时,如果指定的路由名在路由表中已注册,则会调用路由表中的builder函数来生成路由组件;如果路由表中没有注册,才会调用onGenerateRoute来生成路由。
    注意,onGenerateRoute只会对命名路由生效。

三、包管理

管理第三方依赖包pubspec.yaml

  • YAML是一种直观、可读性高并且容易被人类阅读的文件格式,它和xml或Json相比,它语法简单并非常容易解析,所以YAML常用于配置文件,Flutter也是用yaml文件作为其配置文件。
  • Pub(https://pub.dev/ ) 是Google官方的Dart Packages仓库,类似于node中的npm仓库,android中的jcenter。

四、资源管理

1、Assets

Assets是会打包到程序安装包中的,可在运行时访问。常见类型的assets包括静态数据(例如JSON文件)、配置文件、图标和图片(JPEG,WebP,GIF,动画WebP / GIF,PNG,BMP和WBMP)等。

每个asset都通过相对于pubspec.yaml文件所在的文件系统路径来标识自身的路径。在构建期间,Flutter将asset放置到称为 asset bundle 的特殊存档中,应用程序可以在运行时读取它们(但不能修改)。

Asset 变体(variant)

“asset变体”的概念:不同版本的asset可能会显示在不同的上下文中。

加载 assets

您的应用可以通过 AssetBundle 对象访问其asset 。

有两种主要方法允许从Asset bundle中加载字符串或图片(二进制)文件。

加载图片

注意:声明分辨率相关的图片 assets
AssetImage可以将asset的请求逻辑映射到最接近当前设备像素比例(dpi)的asset。为了使这种映射起作用,必须根据特定的目录结构来保存asset:

…/image.png
…/Mx/image.png
…/Nx/image.png
…etc.
其中M和N是数字标识符,对应于其中包含的图像的分辨率,也就是说,它们指定不同设备像素比例的图片。

例如:

…/my_icon.png
…/2.0x/my_icon.png
…/3.0x/my_icon.png
  • AssetImage,非widget对象
    `new AssetImage('graphics/background.png')

  • Image,widget对象
    Image.asset('graphics/background.png');

注意:使用默认的 asset bundle 加载资源时,内部会自动处理分辨率等,这些处理对开发者来说是无感知的。

  • 其他底层加载类: ImageStreamImageCache

2、依赖包中的资源图片

要加载依赖包中的图像,必须给AssetImage提供package参数。
注意:包在使用本身的资源时也应该加上package参数来获取。

new AssetImage('icons/heart.png', package: 'my_icons')
// 或
new Image.asset('icons/heart.png', package: 'my_icons')
image.png

3、特定平台 assets

主要包括以下两类,需要到各自平台工程下设置。

  • 应用图标
  • 启动默认图

三、调试

flutter analyze(静态代码检查)
Dart Observatory (语句级的单步调试和分析器)


四、项目架构

flutter项目中,一般源码存放在lib中。

│  ── lib 
│   ├── common(通用模块)
│       utils (通用工具库)
│       network(通用网络库)    
│       database(通用数据库)
│   ├── core
│       apis(接口定义)
│       config(初始化配置模块)
│       tools(本工程特有工具模块)
│       models(本工程特有工具模块)
│   ├── main.dart
│   ├── pages(业务模块)
│       login
│       home
│   ├── router(路由模块)
│   └── widgets(本工程特有的widget,按照功能划分)
│  ── mock(接口数据)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容