Flutter 插件资源

猫哥Flutter

pubdev.top

Getx 状态管理

描述

GetX 不仅是一个状态管理库,而且是一个与路由管理依赖注入相结合的微框架。它旨在为Flutter提供顶级的开发体验,是一个额外的轻量级但强大的解决方案。GetX有三个基本原则,它是在此基础上建立的。

  1. 性能:注重内存和资源的最小消耗
  2. 生产力:直观和高效的工具,结合简单和直接的语法,最终节省开发时间
  3. 组织性:将业务逻辑与视图和表现逻辑解耦,没有比这更好的了。你不需要上下文在路由之间导航,也不需要有状态的小工具

功能

  1. 状态管理
    GetX两个状态管理器。一个是与GetBuilder 函数一起使用的简单状态管理器,另一个是与Getx 或Obx 一起使用的反应式状态管理器。我们将在下文中详细论述!
  2. 路由管理
    无论是在屏幕之间导航显示SnackBars弹出对话框还是在不使用context 的情况下添加底层表单,GetX都能满足你的要求。我不会写关于路线管理的细节,因为它超出了本文的范围,但确实有几个例子可以让人了解GetX语法的简洁性是如何工作的
  3. 依赖管理
    GetX有一个简单而强大的解决方案,使用控制器进行依赖性管理。只需一行代码,就可以从视图中访问它,而无需使用继承的部件或上下文。通常情况下,你会在一个类中实例化一个类,但使用GetX,你是用Get 实例进行实例化,它将在整个应用程序中可用。

增值功能

  1. 国际化:
    用键值地图进行翻译,支持各种语言,使用单数、复数和参数的翻译。在整个应用程序中只使用Get 字来改变应用程序的地域性
  2. 验证:
    电子邮件和密码验证也被GetX覆盖。现在你不需要安装一个单独的验证包。
  3. 存储:
    GetX还提供了快速和超轻的同步键值数据备份,完全用Dart编写,很容易与GetX核心包集成。
  4. 主题:
    GetX使浅色和深色主题之间的切换变得简单。
  5. 响应式视图:
    如果你正在为不同的屏幕尺寸构建一个应用程序,你只需要用GetView ,就可以快速开发你的用户界面,这将是对桌面、平板电脑、手机和手表的响应。

get_storage

特性

简单的地图存储。
超文本传输协议请求缓存
存储简单的用户信息。
简单持久的状态存储
您当前使用的任何情况。

安装依赖

1
flutter pub add get_storage

flutter_screenutil

描述

屏幕适配 字体大小适配
现在的手机品牌和型号越来越多,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同
比如我们的设计稿一个View的大小是300px,如果直接写300px,可能在当前设备显示正常,但到了其他设备可能就会偏小或者偏大,这就需要我们对屏幕进行适配
安卓原生的话有自己的适配规则,可以根据不同的尺寸建立不同的文件夹,系统会根据当前的设备尺寸取对应的大小的布局。而flutter本身并没有适配规则,而原生的又比较繁琐,这就需要我们自己去对屏幕进行适配。

安装依赖

1
flutter pub add flutter_screenutil

导入依赖项

1
import 'package:flutter_screenutil/flutter_screenutil.dart';

基本使用

ScreenUtilInit

1. ScreenUtilInit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
//填入设计稿中设备的屏幕尺寸,单位dp
return ScreenUtilInit(
designSize: Size(360, 690),
builder: () => MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter_ScreenUtil',
theme: ThemeData(
primarySwatch: Colors.blue,
//要支持下面这个需要使用第一种初始化方式
textTheme: TextTheme(
button: TextStyle(fontSize: 45.sp)
),
),
home: HomePage(title: 'FlutterScreenUtil Demo'),
),
);
}
}

ScreenUtil.init

ScreenUtil.init

ScreenUtil.init只需在home或者根路由(即第一个flutter页面)中调用一次即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter_ScreenUtil',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(title: 'FlutterScreenUtil Demo'),
);
}
}

class HomePage extends StatefulWidget {
const HomePage({Key key, this.title}) : super(key: key);

final String title;

@override
_HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
//设置尺寸(填写设计中设备的屏幕尺寸)如果设计基于360dp * 690dp的屏幕
ScreenUtil.init(
BoxConstraints(
maxWidth: MediaQuery.of(context).size.width,
maxHeight: MediaQuery.of(context).size.height),
designSize: Size(360, 690),
orientation: Orientation.portrait);
return Scaffold();
}
}
结合 getx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import 'package:flutter_screenutil/flutter_screenutil.dart';

class App extends StatelessWidget {
const App({super.key});

@override
Widget build(BuildContext context) {
//设置尺寸(填写设计中设备的屏幕尺寸)如果设计基于360dp * 690dp的屏幕
/* ScreenUtil.init(
context,
// 设计稿大小
designSize: const Size(720, 1280),
);
*/
return ScreenUtilInit(
// designSize: const Size(720, 1280),
//设置初始化屏幕大小
designSize: const Size(375, 812),
builder: (context, child) => GetMaterialApp(
title: '好客租房Demo',
theme: ThemeData(
// 主题颜色
primarySwatch: Colors.teal,
),
// home: const LoginPage(),
// 未知路由
unknownRoute: GetPage(
name: Routes.UNKNOW,
page: () => const UnknowPage(),
transition: Transition.downToUp
),
// 关闭 debugger 标签
debugShowCheckedModeBanner: false,
// 初始路由
initialRoute: AppPages.INITIAL,
getPages: AppPages.routes,
// 默认路由动画
defaultTransition: Transition.zoom,
builder: EasyLoading.init(),
),
);
}
}

属性

属性类型默认值描述
designSizeSizeSize(360, 690)设计稿中设备的尺寸(单位随意,建议dp,但在使用过程中必须保持一致)
builderWidget Function()Container()一般返回一个MaterialApp类型的Function()
orientationOrientationportrait屏幕方向
splitScreenModebooltrue支持分屏尺寸

API描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ScreenUtil().setWidth(540)  (sdk>=2.6 : 540.w)   //根据屏幕宽度适配尺寸
ScreenUtil().setHeight(200) (sdk>=2.6 : 200.h) //根据屏幕高度适配尺寸(一般根据宽度适配即可)
ScreenUtil().radius(200) (sdk>=2.6 : 200.r) //根据宽度或高度中的较小者进行适配

ScreenUtil().setSp(24) (sdk>=2.6 : 24.sp) //适配字体
24.sm // 取 24和 24.sp 中的最小值

ScreenUtil.pixelRatio //设备的像素密度
ScreenUtil.screenWidth (sdk>=2.6 : 1.sw) //设备宽度
ScreenUtil.screenHeight (sdk>=2.6 : 1.sh) //设备高度
ScreenUtil.bottomBarHeight //底部安全区距离,适用于全面屏下面有按键的
ScreenUtil.statusBarHeight //状态栏高度 刘海屏会更高
ScreenUtil.textScaleFactor //系统字体缩放比例

ScreenUtil().scaleWidth // 实际宽度与设计稿宽度的比例
ScreenUtil().scaleHeight // 实际高度与设计稿高度的比例

ScreenUtil().orientation //屏幕方向

0.2.sw //屏幕宽度的 0.2倍
0.5.sh //屏幕高度的 0.5倍

设置字体

1
Text("顶部内容", style: TextStyle(fontSize: 40.sp))

设置宽高

1
2
3
4
5
6
/// 宽高是宽度的 0.5 倍 , 显示正方形
Container(
width: 0.5.sw,
height: 0.5.sw,
color: Colors.green,
)

dio

dio 是一个强大的 HTTP 网络请求库支持全局配置Restful APIFormData拦截器请求取消Cookie 管理、文件上传/下载超时自定义适配器转换器等。

安装依赖

1
flutter pub add dio

示例

GET 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import 'package:dio/dio.dart';

final dio = Dio();

void request() async {
Response response;
response = await dio.get('/test?id=12&name=dio');
print(response.data.toString());
// The below request is the same as above.
response = await dio.get(
'/test',
queryParameters: {'id': 12, 'name': 'dio'},
);
print(response.data.toString());
}

POST 请求

1
response = await dio.post('/test', data: {'id': 12, 'name': 'dio'});

并发请求

1
response = await Future.wait([dio.post('/info'), dio.get('/token')]);

下载文件

1
2
3
4
response = await dio.download(
'https://www.google.com/',
'${(await getTemporaryDirectory()).path}google.html',
);

以流的方式接收响应数据

1
2
3
4
5
final rs = await dio.get(
url,
options: Options(responseType: ResponseType.stream), // 设置接收类型为 `stream`
);
print(rs.data.stream); // 响应流

以二进制数组的方式接收响应数据

1
2
3
4
5
final rs = await dio.get(
url,
options: Options(responseType: ResponseType.bytes), // 设置接收类型为 `bytes`
);
print(rs.data); // 类型: List<int>

发送 FormData

1
2
3
4
5
final formData = FormData.fromMap({
'name': 'dio',
'date': DateTime.now().toIso8601String(),
});
final response = await dio.post('/info', data: formData);

通过 FormData 上传多个文件

1
2
3
4
5
6
7
8
9
10
final formData = FormData.fromMap({
'name': 'dio',
'date': DateTime.now().toIso8601String(),
'file': await MultipartFile.fromFile('./text.txt', filename: 'upload.txt'),
'files': [
await MultipartFile.fromFile('./text1.txt', filename: 'text1.txt'),
await MultipartFile.fromFile('./text2.txt', filename: 'text2.txt'),
]
});
final response = await dio.post('/info', data: formData);

监听发送(上传)数据进度

1
2
3
4
5
6
7
final response = await dio.post(
'https://www.dtworkroom.com/doris/1/2.0.0/test',
data: {'aa': 'bb' * 22},
onSendProgress: (int sent, int total) {
print('$sent $total');
},
);

以流的形式提交二进制数据

1
2
3
4
5
6
7
8
9
10
11
// Binary data
final postData = <int>[0, 1, 2];
await dio.post(
url,
data: Stream.fromIterable(postData.map((e) => [e])), // 构建 Stream<List<int>>
options: Options(
headers: {
Headers.contentLengthHeader: postData.length, // 设置 content-length.
},
),
);

Dio APIs

你可以使用默认配置或传递一个可选 BaseOptions参数来创建一个Dio实例 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
final dio = Dio(); // With default `Options`.

void configureDio() {
// Update default configs.
dio.options.baseUrl = 'https://api.pub.dev';
dio.options.connectTimeout = Duration(seconds: 5);
dio.options.receiveTimeout = Duration(seconds: 3);

// Or create `Dio` with a `BaseOptions` instance.
final options = BaseOptions(
baseUrl: 'https://api.pub.dev',
connectTimeout: Duration(seconds: 5),
receiveTimeout: Duration(seconds: 3),
);
final anotherDio = Dio(options);
}

Dio 的核心 API 是:

1
2
3
4
5
6
7
8
9
Future<Response<T>> request<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
Options? options,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
});
1
2
3
4
5
final response = await dio.request(
'/test',
data: {'id': 12, 'name': 'dio'},
options: Options(method: 'GET'),
);

请求配置

BaseOptions 描述的是 Dio 实例发起网络请求的的公共配置, 而 Options 描述了每一个Http请求的配置信息,每一次请求都可以单独配置, 单次请求的 Options 中的配置信息可以覆盖 BaseOptions 中的配置。 下面是 Options 的配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/// 请求方式。
String method;

/// 请求基本地址,可以包含路径例如 https://dart.dev/api/。
String? baseUrl;

/// HTTP 请求头。
Map<String, dynamic>? headers;

/// 连接服务器超时时间.
Duration? connectTimeout;

/// 两次数据流数据接收的最长间隔时间,注意不是请求的最长接收时间。
Duration? receiveTimeout;

/// 请求内容体,可以是任意类型。
dynamic data;

/// 请求路径,如果以 http(s)开始, 则 [baseURL] 会被忽略,
/// 否则将会和 [baseUrl] 拼接出完整的地址。
String path = '';

/// 请求的 Content-Type。
///
/// 默认值会由 [ImplyContentTypeInterceptor] 根据请求载荷类型进行推导。
/// 可以调用 [Interceptors.removeImplyContentTypeInterceptor] 进行移除。
///
/// 如果你想以 `application/x-www-form-urlencoded` 格式编码请求数据,
/// 可以设置此选项为 `Headers.formUrlEncodedContentType`,
/// [Dio] 会自动编码请求体。
String? contentType;

/// 期望以哪种格式(方式)接受响应数据,包括 `json``stream``plain`
///
/// 默认值是 `json`, 当响应头中 content-type 为 `application/json` 时,
/// dio 会自动将响应内容转化为 json 对象。
/// 如果想以二进制方式接受响应数据,如下载一个二进制文件,那么可以使用 `stream`
///
/// 如果想以文本(字符串)格式接收响应数据,请使用 `plain`
ResponseType? responseType;

/// `validateStatus` 决定 HTTP 响应状态码是否被视为请求成功,
/// 返回 `true` 请求结果就会按成功处理,否则会按失败处理.
ValidateStatus? validateStatus;

/// 用户自定义字段,可以在 [Interceptor]、[Transformer] 和 [Response] 中依次传递。
Map<String, dynamic>? extra;

/// 请求地址的参数。
Map<String, dynamic /*String|Iterable<String>*/ >? queryParameters;

/// 请求数据中数组的编码的方式,默认值为 `multiCompatible`
ListFormat? listFormat;

响应数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// 响应数据。可能已经被转换了类型, 详情请参考 [ResponseType]。
T? data;

/// 响应对应的请求配置。
RequestOptions requestOptions;

/// 响应的 HTTP 状态码。
int? statusCode;

/// 响应对应状态码的详情信息。
String? statusMessage;

/// 响应是否被重定向
bool isRedirect;

/// 请求连接经过的重定向列表。如果请求未经过重定向,则列表为空。
List<RedirectRecord> redirects;

/// 在 [RequestOptions] 中构造的自定义字段。
Map<String, dynamic> extra;

/// 响应对应的头数据。
Headers headers;

请求成功后,你可以访问到下列字段:

1
2
3
4
5
final response = await dio.get('https://pub.dev');
print(response.data);
print(response.headers);
print(response.requestOptions);
print(response.statusCode);

拦截器

每个 Dio 实例都可以添加任意多个拦截器,他们会组成一个队列,拦截器队列的执行顺序是先进先出。 通过使用拦截器,你可以在请求之前、响应之后和发生异常时(未被 then 或 catchError 处理) 做一些统一的预处理操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// 如果你想完成请求并返回一些自定义数据,你可以使用 `handler.resolve(response)`。
// 如果你想终止请求并触发一个错误,你可以使用 `handler.reject(error)`。
return handler.next(options);
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
// 如果你想终止请求并触发一个错误,你可以使用 `handler.reject(error)`。
return handler.next(response);
},
onError: (DioException e, ErrorInterceptorHandler handler) {
// 如果你想完成请求并返回一些自定义数据,你可以使用 `handler.resolve(response)`。
return handler.next(e);
},
),
);

一个简单的自定义拦截器示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import 'package:dio/dio.dart';
class CustomInterceptors extends Interceptor {
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
print('REQUEST[${options.method}] => PATH: ${options.path}');
super.onRequest(options, handler);
}

@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
print('RESPONSE[${response.statusCode}] => PATH: ${response.requestOptions.path}');
super.onResponse(response, handler);
}

@override
Future onError(DioException err, ErrorInterceptorHandler handler) async {
print('ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}');
super.onError(err, handler);
}
}

完成和终止请求/响应

在所有拦截器中,你都可以改变请求执行流, 如果你想完成请求/响应并返回自定义数据,你可以 resolve 一个 Response 对象 或返回 handler.resolve(data) 的结果。 如果你想终止(触发一个错误,上层 catchError 会被调用)一个请求/响应, 那么可以 reject 一个DioException 对象或返回 handler.reject(errMsg) 的结果。

1
2
3
4
5
6
7
8
9
10
11
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
return handler.resolve(
Response(requestOptions: options, data: 'fake data'),
);
},
),
);
final response = await dio.get('/test');
print(response.data); // 'fake data'

日志拦截器

我们可以添加 LogInterceptor 拦截器来自动打印请求、响应日志:

1
dio.interceptors.add(LogInterceptor(responseBody: false)); // 不输出响应内容体

错误处理

当请求过程中发生错误时, Dio 会将 Error/Exception 包装成一个 DioException:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try {
// 404
await dio.get('https://api.pub.dev/not-exist');
} on DioException catch (e) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx and is also not 304.
if (e.response != null) {
print(e.response.data)
print(e.response.headers)
print(e.response.requestOptions)
} else {
// Something happened in setting up or sending the request that triggered an Error
print(e.requestOptions)
print(e.message)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// 错误的请求对应的配置。
RequestOptions requestOptions;

/// 错误的请求对应的响应内容。如果请求未完成,响应内容可能为空。
Response? response;

/// 错误的类型。
DioExceptionType type;

/// 实际错误的内容。
Object? error;

/// 实际错误的堆栈。
StackTrace? stackTrace;

/// 错误信息。
String? message;

使用 application/x-www-form-urlencoded 编码

默认情况下, Dio 会将请求数据(除了 String 类型)序列化为 JSON。 如果想要以 application/x-www-form-urlencoded 格式编码, 你可以设置 contentType :

1
2
3
4
5
6
7
8
// Instance level
dio.options.contentType = Headers.formUrlEncodedContentType;
// or only works once
dio.post(
'/info',
data: {'id': 5},
options: Options(contentType: Headers.formUrlEncodedContentType),
);

发送 FormData

Dio 支持发送 FormData, 请求数据将会以 multipart/form-data方式编码, FormData可以包含一个多个文件

1
2
3
4
5
6
final formData = FormData.fromMap({
'name': 'dio',
'date': DateTime.now().toIso8601String(),
'file': await MultipartFile.fromFile('./text.txt',filename: 'upload.txt')
});
final response = await dio.post('/info', data: formData);

多个

1
2
3
4
5
6
final formData = FormData.fromMap({
'files': [
MultipartFile.fromFileSync('path/to/upload1.txt', filename: 'upload1.txt'),
MultipartFile.fromFileSync('path/to/upload2.txt', filename: 'upload2.txt'),
],
});

cupertino_icons

flutter_slider_drawer

flutter_localizations

配置本地国际化
默认情况下,Flutter 只提供美式英语的本地化。如果想要添加其他语言,你的应用必须指定额外的 MaterialApp 或者 CupertinoApp 属性并且添加一个名为 flutter_localizations 的 package。截至到 2023 年 1 月份,这个 package 已经支持大约 79 种语言。

安装依赖包

flutter_localizations

1
flutter pub add flutter_localizations --sdk=flutter

intl
1
flutter pub add intl:any

最终的 pubspec.yaml 文件中形如

1
2
3
4
5
6
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any

下一步,先运行 pub get packages,然后引入 flutter_localizations 库,然后为 MaterialApp 指定 localizationsDelegatessupportedLocales:

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import 'package:flutter_localizations/flutter_localizations.dart';

MaterialApp(
// 配置国际化语言
locale: const Locale('zh'),
localizationsDelegates: const [
// FormBuilderLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('zh'), // 中文
Locale('en'), // 英文
],
)

flutter_launcher_icons

配置app应用图标

一个命令行工具,简化了更新Flutter应用程序启动器图标的任务。完全灵活,允许您选择希望更新启动器图标的平台,如果您愿意,还可以选择保留旧的启动器图标,以防将来某个时候恢复。

添加依赖

1
flutter pub run flutter_launcher_icons

or 在 dev_dependencies 下添加 flutter_launcher_icons

1
2
dev_dependencies:
flutter_launcher_icons: ^0.13.1

添加完记得在获取下依赖:

1
flutter pub get

添加配置

Flutter Launcher图标配置添加到pubspec.yaml中,或者创建一个名为flutter_launcher_icons.yaml的新配置文件。下面是一个例子。更复杂的例子可以在示例项目中找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dev_dependencies:
flutter_launcher_icons: "^0.13.1"

flutter_launcher_icons:
android: "launcher_icon"
ios: true
image_path: "assets/icon/icon.png"
min_sdk_android: 21 # android min sdk min:16, default 21
web:
generate: true
image_path: "path/to/image.png"
background_color: "#hexcode"
theme_color: "#hexcode"
windows:
generate: true
image_path: "path/to/image.png"
icon_size: 48 # min:48, max:256, default: 48
macos:
generate: true
image_path: "path/to/image.png"

如果您将配置文件命名为flutter_launcher_icons.yamlpubspec.yaml以外的名称,则需要在运行包时指定文件名

1
flutter pub run flutter_launcher_icons -f <your config file name here>

注意:如果您没有使用现有的pubspec.yaml,请确保您的配置文件与它位于同一目录中。

运行包替换icon

设置配置后,剩下要做的就是运行包。

1
flutter pub run flutter_launcher_icons

flutter_native_splash

描述

当你的应用程序打开时,会有一段短暂的时间来加载本机应用程序。默认情况下,在此期间,本机应用程序会显示一个白色闪屏。这个包自动生成iOS、Android和Web原生代码,用于定制这个原生闪屏背景颜色和闪屏图像。支持黑暗模式、全屏和特定于平台的选项

安装

1
flutter pub add flutter_native_splash

配置

pubspec.yaml 添加 flutter_native_splash 相关配置

这个包生成本机代码来定制Flutter的默认白色本机启动屏幕带有背景色和飞溅图像。
自定义以下参数,并在终端中运行以下命令:flutter pub run flutter_native_splash:create
要恢复Flutter默认的白色闪屏,请在终端中运行以下命令:flutter pub run flutter_native_splash:remove

1
2
3
4
5
6
# 处理app启动页
flutter_native_splash:
# 背景颜色
color: "#ffffff"
# logo
image: "assets/images/app_icon.png"

执行以下命令生成闪屏!

1
flutter pub run flutter_native_splash:create

或者指定 对应路径的 yml 文件

1
flutter pub run flutter_native_splash:create --path=path/to/my/file.yaml

参数

colorbackground_image是唯一必需的参数。使用颜色设置背景的闪屏设置为纯色。
使用background_image设置闪屏到png图像。这对于渐变很有用。图像将被拉伸到应用程序的大小。
只能使用一个参数,不能同时设置colorbackground_image

参数描述
color“#42a5f5” / “#ffffff”设置闪屏背景颜色(纯色)
background_image“assets/background.png”设置闪屏到png图像。
image“assets/images/app_icon.png”指定启动屏幕中使用的图像。
branding“assets/dart.png”允许您指定在启动屏幕中用作品牌的图像。
branding_modebottom要将品牌图像定位在屏幕底部,可以使用bottombottomRight,和左下角。如果未指定或指定了其他内容,则默认值为bottom
color_dark“#000000”设置背景的参数和图像,当设备处于黑暗模式时!
background_image_dark“assets/dart_dark.png”设置背景的参数和图像,当设备处于黑暗模式时!
image_dark“assets/dart_dark.png”设置背景的参数和图像,当设备处于黑暗模式时!
branding_dark“assets/dart_dark.png”设置背景的参数和图像,当设备处于黑暗模式时!

card_swiper

simple_animationsh

animations

loading加载

flutter_easyloading

添加flutter_easyloading

1
flutter pub add flutter_easyloading

or

1
2
dependencies:
flutter_easyloading: ^latest

导入

1
import 'package:flutter_easyloading/flutter_easyloading.dart';

使用

首先, 在MaterialApp/CupertinoApp/GetMeterialApp中初始化FlutterEasyLoading:

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter EasyLoading',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter EasyLoading'),
builder: EasyLoading.init(),
);
}
}

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
EasyLoading.show(status: 'loading...');

EasyLoading.showProgress(0.3, status: 'downloading...');

EasyLoading.showSuccess('Great Success!');

EasyLoading.showError('Failed with Error');

EasyLoading.showInfo('Useful Information.');

EasyLoading.showToast('Toast');

EasyLoading.dismiss();

自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/// loading的样式, 默认[EasyLoadingStyle.dark].
EasyLoadingStyle loadingStyle;

/// loading的指示器类型, 默认[EasyLoadingIndicatorType.fadingCircle].
EasyLoadingIndicatorType indicatorType;

/// loading的遮罩类型, 默认[EasyLoadingMaskType.none].
EasyLoadingMaskType maskType;

/// toast的位置, 默认 [EasyLoadingToastPosition.center].
EasyLoadingToastPosition toastPosition;

/// 动画类型, 默认 [EasyLoadingAnimationStyle.opacity].
EasyLoadingAnimationStyle animationStyle;

/// 自定义动画, 默认 null.
EasyLoadingAnimation customAnimation;

/// 文本的对齐方式 , 默认[TextAlign.center].
TextAlign textAlign;

/// 文本的样式 , 默认 null.
TextStyle textStyle;

/// loading内容区域的内边距.
EdgeInsets contentPadding;

/// 文本的内边距.
EdgeInsets textPadding;

/// 指示器的大小, 默认40.0.
double indicatorSize;

/// loading的圆角大小, 默认5.0.
double radius;

/// 文本大小, 默认15.0.
double fontSize;

/// 进度条指示器的宽度, 默认2.0.
double progressWidth;

/// 指示器的宽度, 默认4.0, 仅对[EasyLoadingIndicatorType.ring, EasyLoadingIndicatorType.dualRing]有效.
double lineWidth;

/// [showSuccess] [showError] [showInfo]的展示时间, 默认2000ms.
Duration displayDuration;

/// 动画时间, 默认200ms.
Duration animationDuration;

/// 文本的颜色, 仅对[EasyLoadingStyle.custom]有效.
Color textColor;

/// 指示器的颜色, 仅对[EasyLoadingStyle.custom]有效.
Color indicatorColor;

/// 进度条指示器的颜色, 仅对[EasyLoadingStyle.custom]有效.
Color progressColor;

/// loading的背景色, 仅对[EasyLoadingStyle.custom]有效.
Color backgroundColor;

/// 遮罩的背景色, 仅对[EasyLoadingMaskType.custom]有效.
Color maskColor;

/// 当loading展示的时候,是否允许用户操作.
bool userInteractions;

/// 点击背景是否关闭.
bool dismissOnTap;

/// 指示器自定义组件
Widget indicatorWidget;

/// 展示成功状态的自定义组件
Widget successWidget;

/// 展示失败状态的自定义组件
Widget errorWidget;

/// 展示信息状态的自定义组件
Widget infoWidget;

因为 EasyLoading 是一个全局单例, 所以你可以在任意一个地方自定义它的样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
EasyLoading.instance
..displayDuration = const Duration(milliseconds: 2000)
..indicatorType = EasyLoadingIndicatorType.fadingCircle
..loadingStyle = EasyLoadingStyle.dark
..indicatorSize = 45.0
..radius = 10.0
..progressColor = Colors.yellow
..backgroundColor = Colors.green
..indicatorColor = Colors.yellow
..textColor = Colors.yellow
..maskColor = Colors.blue.withOpacity(0.5)
..userInteractions = true
..dismissOnTap = false
..customAnimation = CustomAnimation();

添加 Loading 状态回调

1
2
3
EasyLoading.addStatusCallback((status) {
print('EasyLoading Status $status');
});

移除 Loading 状态回调

1
2
3
EasyLoading.removeCallback(statusCallback);

EasyLoading.removeAllCallbacks();

flutter_easyrefresh

顾名思义,EasyRefresh可以在Flutter应用上轻松实现下拉刷新和上拉加载。它支持几乎所有的Flutter可滚动部件。它的功能和Android的SmartReshLayout非常相似,也吸收了很多第三方库的优点。EasyRefresh集成了各种风格的页眉和页脚,但它没有限制,你可以很容易地定制它。使用Flutter强大的动画,即使只是一个简单的控制也可以完成。EasyRefresh的目标是为Flutter创建一个强大、稳定、成熟的拉到刷新框架。

pull_to_refresh

提供给flutter scroll组件下拉刷新和上拉加载的小部件。支持android和ios。

card_loading

Flutter软件包可轻松创建两种颜色之间的加载卡

通知或提示

top_snackbar_flutter

flutter_slidable

可滑动列表项的Flutter实现,具有可以消除的定向滑动动作

scroll_to_animate_tab

data_table_2

flutter_expandable_fab

form_page_view

pluto_grid

数据表格展示

flutter_animate

azlistview

Flutter 粘性标题和索引 ListView。索引栏。如城市列表、联系人列表。索引和悬停效果。

tab_container

once

想要定期运行一段代码(一次 - 每日 - 每周 - 每月 - 在新版本上 - 任何时期)

showcaseview

awesome_notifications

使用FlutterAndroidiOSWeb上创建本地通知。
使用附加插件发送推送通知,如awesome_notifications_fcm
在通知上添加图像、声音、表情符号、按钮和不同的布局。
易于使用和高度可定制。
通知可以在任何时候创建(在前台、后台,甚至当应用程序被终止/终止时)。
在任何应用程序生命周期中接收通知时高度可信。
当用户创建、显示、解除甚至点击通知事件时,会在颤振级别代码上接收到通知事件。
通知可以重复安排,也可以不重复安排,精度第二。

common_utils

工具类

device_info_plus

获取设备信息

connectivity_plus

检查网络链接

syncfusion_flutter_charts

charts 图表

flutter_local_notifications

设置通知栏消息提示

vercoder_inputer

验证码输入框

amap_location

高德地图

location

位置获取

skeletonizer

flutter_zoom_drawer

带有侧菜单(抽屉)自定义实现的Flutter包

adaptive_theme

在你的Flutter应用程序中添加明暗主题支持的最简单方法。它允许手动设置亮或暗主题,也允许您根据系统定义主题。它还会在应用程序重启时保持主题模式的变化。

tab_container

一个漂亮的、动画的、可定制的选项卡视图小部件。这个小部件是自包含的,所以您只需传入一个子列表和一个选项卡列表,它就会处理其余的事情。您还可以使用控制器、更改选项卡侧面、添加颜色等等。

awesome_extensions

Flutter软件包可轻松创建两种颜色之间的加载卡

alice

Alice是Flutter的一个HTTP Inspector工具,可以帮助调试HTTP请求。它捕获并存储http请求和响应,可以通过简单的UI查看。它的灵感来自查克和查克。

board_datetime_picker

nine_grid_view

类似微博动态、WeChat朋友圈,九格视图控件显示图片。支持单张大图预览。
还支持WeChat群、DingTalk群、QQ群头像特效

loop_page_view

styled_widget

settings_ui

使用Flutter的设置UI,在一瞬间构建美丽的设置屏幕UI

flutter_sticky_header

一个Flutter实现的粘性头

flutter_custom_clippers

实现各种自定义形状。

图片

flutter_image_compress

图片压缩

extended_image

强大的官方Image扩展组件,支持加载以及失败显示,缓存网络图片,缩放拖拉图片,图片浏览(微信掘金效果),滑动退出页面(微信掘金效果),裁剪,保存,绘制自定义效果等功能

hl_image_picker

fancy_shimmer_image

为从互联网上传图像而创建的包,提供了在图像未加载时显示美丽微光动画的可能性。并且仍然可以创建一个小部件来显示,以防图像上传由于某种原因失败。

image_watermark

图像水印是在图像上添加文本水印和图像水印的软件包,你可以自定义水印的位置和颜色。基于图像打包。

fancy_shimmer_image

包创建的目的是从互联网上传图像,使一个美丽的微光动画的可能性,而图像不加载。它仍然可以创建一个小部件显示的情况下,图像上传失败的某种原因。

cached_network_image

image_picker

可以访问手机相册或者拍照来获取照片视频!

安装

1
flutter pub add image_picker

or

1
2
dependencies:
image_picker: ^0.8.7+5

配置访问权限

android 配置

打开app/src/main/AndroidManifest.xml文件,添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
<manifest>
<application>
...
</application>
// 写入文件权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 读取文件权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
// 相机权限
<uses-permission android:name="android.permission.CAMERA" />
</manifest>
ios 配置

打开ios/Runner/Info.plist 添加以下内容:

1
2
3
4
5
6
7
8
9
 <!-- 增加相机拍摄 和 相册权限 -->
<key>NSCameraUsageDescription</key>
<string>cameraDesciption</string>
<key>NSContactsUsageDescription</key>
<string>contactsDesciption</string>
<key>NSMicrophoneUsageDescription</key>
<string>microphoneDesciption</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>photoLibraryDesciption</string>

使用

引入image_picker

1
import 'package:image_picker/image_picker.dart';

sheet弹窗

snapping_sheet

snapping_sheet

wolt_modal_sheet

wolt_modal_sheet

cupertino_modal_sheet

sliding_up_panel

日期

date_picker_timelin

提供日历作为水平时间线的Flutter日期选择器库。

date_picker_timelin

syncfusion_flutter_datepicker

日历选择器

syncfusion_flutter_datepicker

easy_date_timeline

easy_date_timeline 包是一个可定制的Flutter库,它在水平视图中显示日期的时间线。

syncfusion_flutter_datepicker

date_picker_timeline_fixed

提供日历作为水平时间线的Flutter日期选择器库。

date_picker_timeline_fixed