Flutter 插件资源 猫哥Flutter 引用站外地址
猫哥 Flutter 插件资源库
https://flutter.ducafecat.com/pubs/user-journey
pubdev.top 引用站外地址
pubdev.top
https://pubdev.top/#/explore
Getx 状态管理 引用站外地址
插件地址
https://pub.dev/packages/getx
描述 GetX
不仅是一个状态管理库
,而且是一个与路由管理
和依赖注入
相结合的微框架。它旨在为Flutter
提供顶级的开发体验,是一个额外的轻量级但强大的解决方案。GetX有三个基本原则,它是在此基础上建立的。
性能
:注重内存和资源的最小消耗生产力
:直观和高效的工具,结合简单和直接的语法,最终节省开发时间组织性
:将业务逻辑与视图和表现逻辑解耦,没有比这更好的了。你不需要上下文在路由之间导航,也不需要有状态的小工具功能 状态管理
GetX
有两个状态管理器
。一个是与GetBuilder
函数一起使用的简单状态管理器,
另一个是与Getx 或Obx
一起使用的反应式状态管理器
。我们将在下文中详细论述!路由管理
无论是在屏幕之间导航
、显示SnackBars
、弹出对话框
,还是在不使用context 的情况下添加底层表单
,GetX都能满足你的要求。我不会写关于路线管理的细节,因为它超出了本文的范围,但确实有几个例子可以让人了解GetX语法的简洁性是如何工作的依赖管理
GetX有一个简单而强大的解决方案,使用控制器进行依赖性管理。只需一行代码,就可以从视图中访问它,而无需使用继承的部件或上下文。通常情况下,你会在一个类中实例化一个类,但使用GetX,你是用Get 实例进行实例化,它将在整个应用程序中可用。增值功能 国际化:
用键值地图进行翻译,支持各种语言,使用单数、复数和参数的翻译。在整个应用程序中只使用Get 字来改变应用程序的地域性验证:
电子邮件和密码验证也被GetX覆盖。现在你不需要安装一个单独的验证包。存储:
GetX还提供了快速和超轻的同步键值数据备份,完全用Dart编写,很容易与GetX核心包集成。主题:
GetX使浅色和深色主题之间的切换变得简单。响应式视图:
如果你正在为不同的屏幕尺寸构建一个应用程序,你只需要用GetView
,就可以快速开发你的用户界面,这将是对桌面、平板电脑、手机和手表的响应。get_storage 引用站外地址
插件地址
https://pub.dev/packages/get_storage
特性
简单的地图存储。 超文本传输协议请求缓存 存储简单的用户信息。 简单持久的状态存储 您当前使用的任何情况。
安装依赖 1 flutter pub add get_storage
flutter_screenutil 引用站外地址
插件地址
https://pub.dev/packages/flutter_screenutil
引用站外地址
中文文档
https://github.com/OpenFlutter/flutter_screenutil/blob/master/README_CN.md
引用站外地址
插件作者博客
https://blog.csdn.net/u011272795/article/details/82795477
描述 屏幕适配 字体大小适配
现在的手机品牌和型号越来越多
,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同
, 比如我们的设计稿一个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) { 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) { 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) { return ScreenUtilInit( designSize: const Size(375 , 812 ), builder: (context, child) => GetMaterialApp( title: '好客租房Demo' , theme: ThemeData( primarySwatch: Colors.teal, ), unknownRoute: GetPage( name: Routes.UNKNOW, page: () => const UnknowPage(), transition: Transition.downToUp ), debugShowCheckedModeBanner: false , initialRoute: AppPages.INITIAL, getPages: AppPages.routes, defaultTransition: Transition.zoom, builder: EasyLoading.init(), ), ); } }
属性 属性 类型 默认值 描述 designSize
Size
Size(360, 690)
设计稿中设备的尺寸(单位随意,建议dp,但在使用过程中必须保持一致)
builder
Widget Function()
Container()
一般返回一个MaterialApp类型的Function()
orientation
Orientation
portrait
屏幕方向
splitScreenMode
bool
true
支持分屏尺寸
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 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.5 .sh
设置字体 1 Text("顶部内容" , style: TextStyle(fontSize: 40. sp))
设置宽高 1 2 3 4 5 6 Container( width: 0.5 .sw, height: 0.5 .sw, color: Colors.green, )
dio dio
是一个强大的 HTTP
网络请求库
,支持全局配置
、Restful API
、FormData
、拦截器
、 请求取消
、Cookie
管理、文件上传/下载
、超时
、自定义适配器
、转换器
等。
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/dio
引用站外地址
文档地址
https://github.com/cfug/dio/blob/main/dio/README-ZH.md
安装依赖 示例 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()); 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), ); print (rs.data.stream);
以二进制数组的方式接收响应数据 1 2 3 4 5 final rs = await dio.get ( url, options: Options(responseType: ResponseType.bytes), ); print (rs.data);
1 2 3 4 5 final formData = FormData.fromMap({ 'name' : 'dio' , 'date' : DateTime .now().toIso8601String(), }); final response = await dio.post('/info' , data: 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 final postData = <int >[0 , 1 , 2 ];await dio.post( url, data: Stream.fromIterable(postData.map((e) => [e])), options: Options( headers: { Headers.contentLengthHeader: postData.length, }, ), );
Dio APIs
你可以使用默认配置或传递一个可选 BaseOptions参数来创建一个Dio实例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 final dio = Dio(); void configureDio() { dio.options.baseUrl = 'https://api.pub.dev' ; dio.options.connectTimeout = Duration (seconds: 5 ); dio.options.receiveTimeout = Duration (seconds: 3 ); 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;String? baseUrl;Map <String , dynamic >? headers;Duration? connectTimeout;Duration? receiveTimeout;dynamic data;String path = '' ;String? contentType;ResponseType? responseType; ValidateStatus? validateStatus; Map <String , dynamic >? extra;Map <String , dynamic >? queryParameters;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 T? data; RequestOptions requestOptions; int? statusCode;String? statusMessage;bool isRedirect;List <RedirectRecord> redirects;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) { return handler.next(options); }, onResponse: (Response response, ResponseInterceptorHandler handler) { return handler.next(response); }, onError: (DioException e, ErrorInterceptorHandler handler) { 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);
日志拦截器 我们可以添加 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 { await dio.get ('https://api.pub.dev/not-exist' ); } on DioException catch (e) { if (e.response != null ) { print (e.response.data) print (e.response.headers) print (e.response.requestOptions) } else { 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;
默认情况下, Dio
会将请求数据(除了 String
类型)序列化为 JSON
。 如果想要以 application/x-www-form-urlencoded
格式编码, 你可以设置 contentType
:
1 2 3 4 5 6 7 8 dio.options.contentType = Headers.formUrlEncodedContentType; dio.post( '/info' , data: {'id' : 5 }, options: Options(contentType: Headers.formUrlEncodedContentType), );
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 引用站外地址
插件地址
https://pub.dev/packages/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
指定 localizationsDelegates
和 supportedLocales:
使用 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 [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('zh' ), Locale('en' ), ], )
flutter_launcher_icons 引用站外地址
插件地址
https://pub.dev/packages/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
添加完记得在获取下依赖:
添加配置 将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 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 macos: generate: true image_path: "path/to/image.png"
如果您将配置文件命名为flutter_launcher_icons.yaml
或pubspec.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 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/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 flutter_native_splash: color: "#ffffff" 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
参数 color
或background_image
是唯一必需的参数。使用颜色设置背景的闪屏设置为纯色。 使用background_image
设置闪屏到png
图像。这对于渐变很有用。图像将被拉伸到应用程序的大小。 只能使用一个参数,不能同时设置color
和background_image
。
参数 值 描述 color
“#42a5f5” / “#ffffff” 设置闪屏背景颜色(纯色) background_image
“assets/background.png” 设置闪屏到png
图像。 image
“assets/images/app_icon.png” 指定启动屏幕中使用的图像。 branding
“assets/dart.png” 允许您指定在启动屏幕中用作品牌的图像。 branding_mode
bottom 要将品牌图像定位在屏幕底部,可以使用bottom
、bottomRight
,和左下角。如果未指定或指定了其他内容,则默认值为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 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/flutter_easyloading
引用站外地址
中文文档
https://github.com/nslogx/flutter_easyloading/blob/develop/README-zh_CN.md
引用站外地址
在线预览
https://nslogx.github.io/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 EasyLoadingStyle loadingStyle; EasyLoadingIndicatorType indicatorType; EasyLoadingMaskType maskType; EasyLoadingToastPosition toastPosition; EasyLoadingAnimationStyle animationStyle; EasyLoadingAnimation customAnimation; TextAlign textAlign; TextStyle textStyle; EdgeInsets contentPadding; EdgeInsets textPadding; double indicatorSize;double radius;double fontSize;double progressWidth;double lineWidth;Duration displayDuration;Duration animationDuration;Color textColor; Color indicatorColor; Color progressColor; Color backgroundColor; Color maskColor; 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创建一个强大、稳定、成熟的拉到刷新框架。
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/easy_refresh
引用站外地址
示例
https://xuelongqy.github.io/flutter_easy_refresh/
pull_to_refresh 提供给flutter scroll组件下拉刷新和上拉加载的小部件。支持android和ios。
card_loading 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/card_loading
Flutter软件包可轻松创建两种颜色之间的加载卡
通知或提示 top_snackbar_flutter flutter_slidable 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/flutter_slidable
引用站外地址
侧滑组件
https://blog.csdn.net/qq_40785165/article/details/120298992
可滑动列表项的Flutter实现,具有可以消除的定向滑动动作
。
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/scroll_to_animate_tab
data_table_2 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/data_table_2
引用站外地址
简书_dataTable
https://www.jianshu.com/p/6615df8941f3
flutter_expandable_fab
form_page_view
pluto_grid 数据表格展示
flutter_animate azlistview Flutter 粘性标题和索引 ListView。索引栏。如城市列表、联系人列表。索引和悬停效果。
tab_container once 想要定期运行一段代码(一次 - 每日 - 每周 - 每月 - 在新版本上 - 任何时期)
showcaseview
awesome_notifications 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/awesome_notifications
使用Flutter
在Android
、iOS
和Web
上创建本地通知。 使用附加插件发送推送通知,如awesome_notifications_fcm
在通知上添加图像、声音、表情符号、按钮
和不同的布局。 易于使用和高度可定制。 通知可以在任何时候创建(在前台、后台,甚至当应用程序被终止/终止时
)。 在任何应用程序生命周期中接收通知时高度可信。 当用户创建、显示、解除甚至点击通知事件时,会在颤振级别代码上接收到通知事件。 通知可以重复安排,也可以不重复安排,精度第二。
common_utils 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/common_utils
工具类
device_info_plus 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/device_info_plus
获取设备信息
connectivity_plus 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/connectivity_plus
检查网络链接
syncfusion_flutter_charts charts 图表
flutter_local_notifications 设置通知栏消息提示
验证码输入框
amap_location 高德地图
location 位置获取
skeletonizer
flutter_zoom_drawer 带有侧菜单(抽屉)自定义实现的Flutter包
adaptive_theme 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/adaptive_theme
在你的Flutter应用程序中添加明暗主题支持的最简单方法。它允许手动设置亮或暗主题,也允许您根据系统定义主题。它还会在应用程序重启时保持主题模式的变化。
tab_container 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/tab_container
一个漂亮的、动画的、可定制的选项卡视图小部件。这个小部件是自包含的,所以您只需传入一个子列表和一个选项卡列表,它就会处理其余的事情。您还可以使用控制器、更改选项卡侧面、添加颜色等等。
awesome_extensions 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/awesome_extensions
Flutter软件包可轻松创建两种颜色之间的加载卡
alice 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/alice
Alice是Flutter的一个HTTP Inspector工具,可以帮助调试HTTP请求。它捕获并存储http请求和响应,可以通过简单的UI查看。它的灵感来自查克和查克。
board_datetime_picker 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/board_datetime_picker
nine_grid_view 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/nine_grid_view
类似微博动态、WeChat朋友圈,九格视图控件显示图片。支持单张大图预览。 还支持WeChat群、DingTalk群、QQ群头像特效
loop_page_view
settings_ui 使用Flutter的设置UI,在一瞬间构建美丽的设置屏幕UI
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/settings_ui
一个Flutter实现的粘性头
flutter_custom_clippers 实现各种自定义形状。
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/flutter_custom_clippers
图片 flutter_image_compress 图片压缩
extended_image 强大的官方Image扩展组件,支持加载以及失败显示,缓存网络图片,缩放拖拉图片,图片浏览(微信掘金效果),滑动退出页面(微信掘金效果),裁剪,保存,绘制自定义效果等功能
hl_image_picker fancy_shimmer_image 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/fancy_shimmer_image
为从互联网上传图像而创建的包,提供了在图像未加载时显示美丽微光动画的可能性。并且仍然可以创建一个小部件来显示,以防图像上传由于某种原因失败。
image_watermark 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/image_watermark
图像水印是在图像上添加文本水印和图像水印的软件包,你可以自定义水印的位置和颜色。基于图像打包。
fancy_shimmer_image 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/fancy_shimmer_image
包创建的目的是从互联网上传图像,使一个美丽的微光动画的可能性,而图像不加载。它仍然可以创建一个小部件显示的情况下,图像上传失败的某种原因。
cached_network_image image_picker 引用站外地址
插件地址
https://pub.dev/packages/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 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/snapping_sheet
snapping_sheet modal_bottom_sheet 引用站外地址
在线案例
https://jamesblasco.github.io/modal_bottom_sheet/#/
wolt_modal_sheet wolt_modal_sheet cupertino_modal_sheet sliding_up_panel 引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/sliding_up_panel
日期 date_picker_timelin 提供日历作为水平时间线的Flutter日期选择器库。
date_picker_timelin syncfusion_flutter_datepicker 日历选择器
引用站外地址
插件地址
https://pub-web.flutter-io.cn/packages/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