Flutter 有很多零散的点,我不可能一一开单章去写,那样的话最后我自己逗找不着了,还是写在一起省事,当然我会合理分配字数的,一篇字数太多话会开新章,一直更新,大家多关注...
目前记录以下知识点:
yaml 项目构建体系
flutter 虽然还运行在 android 上,但是项目构建不再使用 gradle 了,而是重新搞了一套 yaml 构建系统,其核心是: pub 远程仓库,本质上和 gradle 差不多
flutter 项目结构中pubspec.yaml文件是核心配置文件,远程依赖就写在里面,pubspec.lock文件是自动生成的 pubspec.yaml 解释文件,不用我们修改,但是详细记录了一切配置
pubspec.yaml 文件:
pubspec.lock 文件: - 这个图只是上面依赖管理详细展开的部分
pubspec.yaml 文件: - 详细展开
name: flutter_in_action //应用或者包的名称
description: First Flutter application.//应用或者包的描述
version: 1.0.0+1//应用或者包的版本
dependencies://应用或者包依赖的其他包或者插件
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
dev_dependencies://开发环境依赖的工具包(而不是flutter应用本身依赖的包)
flutter_test:
sdk: flutter
flutter://flutter相关的配置选项
uses-material-design: true
其他的以后详说,大家先看看依赖管理,cupertino_icons: ^0.1.2 就是这么简单,cupertino_icons 是库在 pub 远程仓库中的名字,^0.1.2 是版本号,比 gradle 看着舒服多了
依赖管理
上文中说到 Flutter 的远程依赖都写在 pubspec.yaml 文件 里,具体的库依赖写法:cupertino_icons: ^0.1.2,加在一起简单的就是下面这个样子:
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
^表示:和当前版本接口兼容的最新版,^1.2.3 等效于 >=1.2.3 <2.0.0而 ^0.1.2 等效于 >=0.1.2 <0.2.0,添加依赖后点击“Packages get”按钮即可下载插件到本地- Flutter 依赖包由 pub 仓库管理,在里面我们可以查阅最新版本号,不过 pub 网站需要翻墙
- 若是不想麻烦,
版本号可以any,flutter 会自动扫描最新版本,又说这样可以解决版本冲突的
upertino_icons: any
- 完事点一下
packagew upgrade会去更新 - 最后我们在
pubspec.lock中可以看到最新的版本号,然后把any改回具体的版本号 - 至于问什么最后要去掉
any呢,使用any可能会崩... - 依赖本地包:
ependencies:
pkg1:
path: ../../code/pkg1 //本地路径
- 依赖git仓库中的包 -1:
dependencies:
pkg1:
git:
url: git://github.com/xxx/pkg1.git //在git仓库根目录
- 依赖git仓库中的包 -2:
dependencies:
package1:
git:
url: git://github.com/flutter/packages.git
path: packages/package1 //不在git仓库的根目录
flutter packages get- 拉依赖包flutter packages upgrade- 更新依赖包至能兼容的最新版本
any 处理依赖冲突
Flutter 的依赖冲突如下:
Because new_trend depends on
build_runner >=0.9.0 which requires SDK version >=2.0.0-dev.61 <3.0.0, version solving failed.
pub get failed (1)
当时的依赖是这样子的
dev_dependencies:
build_runner: ^0.9.0
依赖的越多,自然就越有可能产生冲突,解决的办法目前我只看到一种:就是上面说的any,让Flutter 自己去查找合理的兼容版本,在pubspec.lock查找新的版本号,用新的版本号代替 any,具体过程看上面即可
导包
Flutter 导报很像 python,可以只导入一部分,可以起别名
1. Flutter import 支持3种写法
// 导入库
import 'B.dart';
// 导库的远程 Url 地址
import 'http://hello/hello.dart';
// Flutter package 包管理
import'package:hello/hello.dart';
前2种写法非常不推荐,虽然没问题,但是出问题不好搞,推荐 package的形式引入包,写 package 的话会把依赖库添加到 Flutter 的 package 包管理器中进行管理
2. show、hine 部分导入
上面是导入整个包,有时我们只需要一部分的话用 show,hine 可以不导入指定类
import 'package:math' show Random;
import 'package:math' hide Random;
3. 起别名
Flutter package 包管理器中是以键值对的形式管理依赖库的,键就是库名,要是2个依赖库有重名的那么就有冲突了,此时只能起别名了
import 'package:math' as mymath;
4. part 导包
Flutter 导包多了一个 part 类型,part 出现的目的是提供本地文件依赖,这样可以把一个非常大的 Dart 文件查分成很多个小的 Dart 文件,在主 Dart 文件中使用 part 和小的 Dart 文件关联起来
part 的特点是:双向透明,传统 A 导入 B,A 可以使用 B 的 API,而 B 却不能使用 A 的 API。但是对于 part 来说,A 和 B 是双向关联的关系,可以相互调用对方的 API,设置import依赖都可以共享
但是对于 part 来说,永远有一个主 Dart 文件,import依赖只能写在主 Dart 文件里,然后主 Dart 文件使用 part 关联其他 Dart 文件,形成一个大的库
注意下面的写法:
library- 给该库起个名字,必须写在谁身上,谁就是主 Dart 文件part- 主 Dart 文件依赖其他细分 Dart 文件part of- 给 主 Dart 文件提供 dart 文件依赖
举个例子:A 是主 Dart 文件,B 提供 Dart 文件依赖给 A
A:
library main; // 给库命名,后面使用该命名就行了
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
part 'B.dart';
void main() => runApp(MyApp());
class A extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Frist Blood!',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
B:
part of main; // 使用库命名
class B extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Text("AAA");
}
}
这里我为了清晰,使用library给库命名了,该命名可以代替主 Dart 文件名。大家要是没写library的话,必须使用 Dart 文件名,下面是注意事项:
library库命名必须写在主 Dart 文件的第一行- 所有的
import导包必须写在主 Dart 文件中,可以同步给其他 part 关联的 Dart 文件,很像 gradle 写脚本集中管理依赖版本
最后大家看一下 B,B 中没有导入material.dart这个包,但是通过 A 的 part 同步,B 一样可以使用 StatelessWidget 类,大家可以试试把 part 注释看看报不报错