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 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(接口数据)

你可能感兴趣的:(3.2、Flutter:概述)