Flutter引入包
Flutter引入包import的各种含义及常用命名规则
import 'dart:xxx';引入Dart标准库
import 'xxx/xxx.dart';引入相对路径的Dart文件
import 'package:xxx/xxx.dart';引入Pub仓库pub.dev(或者pub.flutter-io.cn)中的第三方库
import 'package:project/xxx/xxx.dart';引入自定义的dart文件
import 'xxx' show compute1,compute2 ;只导入compute1,compute2
import 'xxx' hide compute3; 除了compute都引入
import 'xxx' as compute4; 将库重命名,当有名字冲突时
library compute5;定义库名称
part of compute6;表示文件属于某个库
文件导入顺序(从上到下依次)
dart sdk 内的库
flutter内的库
第三方库
自己的库(文件)
相对路径引用
import 'dart:io';
import 'package:material/material.dart';
import 'package:dio/dio.dart';
import 'package:project/common/uitls.dart';
import 'xxx/xxx/xxx/xxx.dart';
命名规范
文件夹
小写下划线 lowercase_with_underscores
文件
小写下划线 lowercase_with_underscores
类名
大写开头的驼峰命名法 UpperCamelCase

变量名
小写开头的驼峰命名法 lowerCamelCase
常量
小写开头的驼峰命名法 lowerCamelCase
首字母缩写词长度不超过两个字母的,首字母大写,比如 HttpRequest
长度两个字母的首字母缩写词可完全大写,比如 IOStream, DBUtils
但单个单词缩写仍然仅首字母大写,比如 Id

Flutter 跨平台条件import不同包
import 'entry_stub.dart'
    if (dart.library.html) 'entry/dio_for_browser.dart'
    if (dart.library.io) 'entry/dio_for_native.dart';
语法说明
imoprt "默认依赖文件"  满足条件时用该依赖替换默认依赖文件
Dio 库里面也是有该方案进行平台兼容
if 可以添加多次 可以满足我们兼容不同平台的需求

//dart.dev/guides/language/effective-dart/style


import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';


指定库的别名
两个库中存在相同的标识符使用时很会冲突 或引入库的内容时 当前文件引入的库比较多
导致使用IDE工具提供的标识符名称联想时出现不是想要选取 影响编码效率 可以使用给库指定别名的方法 来规避问题
import 'package:socket_io_client/socket_io_client.dart' as IO;
只引入库的部分内容 只想引入库的部分内容
// Import only foo.
import 'package:lib1/lib1.dart' show foo;

屏蔽库中的些内容不引入
dart flutter 文件与库的引用导出
import 'package:flutter/material.dart' hide Router;
material文件用了export 关键字导出这些界面类库
用于外层的文件import导入使用
export 'src/material/about.dart';
export 'src/material/animated_icons.dart';
export 'src/material/app.dart';
export 'src/material/app_bar.dart';
export 'src/material/app_bar_theme.dart';
part library和part of
应用中定义了多个类或方法 引用时想只import一个文件就将相关内容全部导出
如果将所有的类或者方法都放在一个文件中 会导致文件十分庞杂,不利于后续维护
为了解决这个问题,使用part library和part of来组织代码
假设存放公共类和方法的文件为为 public.dart 其内容可按如下方法组织
//  定义库的名字
library public;
export 'dart:async';
export 'dart:convert';
export 'dart:io';
export 'package:fluro/fluro.dart';
//  组成这个库的其他文件
part './model/User.dart';
part './model/FriendInfo.dart';
part './model/Message.dart';
文件的开头
library 标识符定义库的名字
是其他子文件与其耦合起来的关键
part 标识符指明组成这个库的其他文件
part部分一定要在import部分的后面
子文件的组织方式如下
以./model/FriendInfo.dart 为例
//  指明与其关联的父库
part of public;
//  定义其他内容
class FriendInfo {
    ...
}
在子文件的开头
用part of标识符 后跟父库的名字 来指明从属关系 注意子文件中不需要引入父库中已经引入的依赖
在写其他业务逻辑代码的时候只需要直接引入
import './public.dart';
延迟加载或异步加载
延迟加载一个库时要使用deferred as来进行导入
import 'package:greetings/hello.dart' deferred as hello;
在使用时需要通用调用 loadLibrary() 来加载对应的内容
Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}
尽管可能在项目中多次调用loadLibrary()来加载一个库但是这个库也只会被加载一次
编写一个库
库是代码复用和逻辑模块化的绝佳手段
库是以包的形式被创造和分发的
dart语言有两种类型的包
包含本地库的应用包(application packages)
和库包(library packages).
应用包通常会依赖其他包 但绝不会有自引用,应用包的反面就是库包
库包是其他包的依赖对象 自己也会依赖其他包 亦有可能会自引用
往往含有会直接运行的脚本 库包的反面就是应用包
编写一个库包
一个库所需的最简内容包括
pubspec 文件
pubspec.yaml文件在库包和应用包中是类似的,二者并没有区别。
lib 目录
库的代码都在lib目录下内容对其他包可见
可在lib文件夹下创造其他层级的文件
按照惯例 逻辑实现的代码通常放在lib/src目录下
在该目录下的文件通常被认为是私有的
其他的包不应引入src目录下的内容从而暴露lib/scr中的API
正确的使用方法是从lib目录下的其他文件中引出内容
组织一个库包
当你创建称为迷你库的小型独立库时
库包最容易维护 扩展和测试
每一个类应该都以一个迷你库的形式存在 除非两个类之间深度耦合
为了引出一个库中的公共api
建议在lib目录下创建一个’main’文件
方便使用者仅仅通过应用单文件来获取库中的所有功能
lib目录下也有可能包含其他可引入的库
例如库可以跨平台工作,但你创建了两个不同的子文件分别依赖dart:io和datr:html
部分包引用了不同的库,在引用这部分内容时需要给他们添加前缀
shelf 包提供了使用Dart语法创建库的服务器的方法
在lib目录下的主文件 shelf.dart 暴露了lib/src下的其他文件中的内容给使用者
export 'src/cascade.dart';
export 'src/handler.dart';
export 'src/handlers/logger.dart';
export 'src/hijack_exception.dart';
export 'src/middleware.dart';
export 'src/pipeline.dart';
export 'src/request.dart';
export 'src/response.dart';
export 'src/server.dart';
export 'src/server_handler.dart';
shelf包还包括一个迷你库
shelf_io 对dart:io中的http请求体进行了简单的封装
引入库文件
当你引用一个库文件的时候可以用package:指令来指定该文件的URI
import 'package:utilities/utilities.dart';

对于引用的文件和被引
文件当两个文件都在lib内部时或者当两个文件都在lib外部时可以使用相对路径导入库
当其中一个文件在lib目录内或者外部时必须使用package
举棋不定时直接会用package
这种语法在两种情况下都可用如何分别从lib目录和网络引入lib/foo/a.dart:

设计良好的库要便于测试
推荐用test包来编写测试用例
可以把测试代码放在包的顶级目录中的test文件夹下
如果给用户创建了命令行工具
请将它们放在bin文件夹下
以便用户可以直接通过pub global activate命令来使用命令行工具
将命令行工具写在executables section以便用户可以直接调用命令行代码而无需调用pub global run方法
任何库自己私有的工具函数或代码可以将它们放在tool文件夹下
关于其他你想要的推送到Pub站点的文件
例如README和CHANGELOG等可以在Publishing a Pageage中查阅具体内容
编写注释
用 dartdoc工具来给你的库添加API注释
Dartdoc 将会解析你的源码
找到其中通过注释语法标记的内容标记示例如下
/// The event handler responsible for updating the badge in the UI.
void updateBadge() {
  ...
}
开源一个库
将其分享在Pub site 用 pub publish 命令来上传或者更新一个库
pub site不仅仅存储你的库 同时也会自动生成并且保存的你库的api引用文档
为了确保包的API文档生成正确遵循以下步骤:
推送包之前,运行dartdoc工具确保文档生成正确且展示符合预期
推送包之后,检查Vesion tab 去报文档生成正确
如果文档生成失败,检查dartdoc的输出