Flutter资源加载插件load的使用
Flutter资源加载插件load的使用
load
是一个全局加载组件,可以通过简单的配置来使用。它是一个纯Flutter库,不使用原生代码。使用方式类似于 OKToast。
目录
ScreenShot
Usage
安装
在 pubspec.yaml
文件中添加依赖:
dependencies:
load: $latest_version
导入
在 Dart 文件中导入 load
包:
import 'package:load/load.dart';
包裹你的应用
将 LoadingProvider
包裹在你的应用根部:
void main() {
runApp(
LoadingProvider(
child: MyApp(),
),
);
}
// 或者
LoadingProvider(
child: MaterialApp(),
);
你也可以在 MaterialApp
的 builder
中包含 LoadingProvider
:
MaterialApp(
builder: (context, widget) {
return LoadingProvider(
child: widget,
);
},
);
显示或隐藏对话框
使用以下方法显示或隐藏加载对话框:
showLoadingDialog();
showCustomLoadingWidget(Container()); // 自定义对话框
hideLoadingDialog();
Advanced Usage
Custom Loading Widget
使用 LoadingThemeData
和 loadingWidgetBuilder
来自定义加载组件:
LoadingProvider(
themeData: LoadingThemeData(),
loadingWidgetBuilder: (ctx, data) {
return Center(
child: SizedBox(
width: 30,
height: 30,
child: Container(
child: CupertinoActivityIndicator(),
color: Colors.blue,
),
),
);
},
child: MyApp(),
);
Custom some config
所有参数都是可选的:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
backgroundColor | Color | Colors.black54 | 背景透明遮罩 |
tapDismiss | bool | true | 点击背景是否关闭? |
loadingBackgroundColor | Color | Colors.white | 中心加载组件的背景颜色 |
loadingPadding | EdgeInsets | EdgeInsets.all(8.0) | 中心加载组件的内边距 |
loadingSize | Size | Size(55,55) | 中心加载组件的大小 |
animDuration | Duration | Duration(milliseconds: 300) | 显示/隐藏动画时间 |
示例代码
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:load/load.dart';
void main() {
runApp(
LoadingProvider(
themeData: LoadingThemeData(
// tapDismiss: false,
),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
void initState() {
super.initState();
showAndDelayDismiss();
}
void _incrementCounter() {
setState(() {
_counter++;
});
showAndDelayDismiss();
}
void showAndDelayDismiss([Duration duration = const Duration(seconds: 2)]) async {
var future = await showLoadingDialog();
Future.delayed(duration, () {
future.dismiss();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: [
buildDefaultDialog(),
buildCustomLoadingButton(),
buildTouchLoadingDialog(),
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
Widget buildCustomLoadingButton() {
return IconButton(
icon: Icon(Icons.cloud_download),
onPressed: () {
showCustomLoadingWidget(
Center(
child: Container(
padding: const EdgeInsets.all(30),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
LinearProgressIndicator(),
Container(height: 10),
Text("loading"),
TextButton(
onPressed: () {
hideLoadingDialog();
},
child: Text('dismiss'),
),
],
),
),
),
tapDismiss: false,
);
},
);
}
Widget buildTouchLoadingDialog() {
return IconButton(
icon: Icon(Icons.touch_app),
onPressed: () {
showCustomLoadingWidget(
Center(
child: Container(
padding: const EdgeInsets.all(30),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
width: 40,
height: 40,
color: Colors.blue,
child: CupertinoActivityIndicator(radius: 10),
),
Container(height: 10),
TextButton(
child: Text("Add"),
onPressed: () {
_counter++;
setState(() {});
print("touch Add button, this counter is :$_counter");
},
),
],
),
),
),
);
},
);
}
Widget buildDefaultDialog() {
return IconButton(
icon: Icon(Icons.slideshow),
onPressed: () {
showLoadingDialog();
},
);
}
Widget exampleLoadApp() {
return LoadingProvider(
themeData: LoadingThemeData(),
loadingWidgetBuilder: (ctx, data) {
return Center(
child: SizedBox(
width: 30,
height: 30,
child: Container(
child: CupertinoActivityIndicator(),
color: Colors.blue,
),
),
);
},
child: MyApp(),
);
}
}
希望这些内容对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter资源加载插件load的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter资源加载插件load的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,load
并不是一个官方提供的资源加载插件的名称。不过,假设你提到的是一个自定义的或第三方资源加载插件,并且这个插件的名字或者某个关键功能叫做 load
,我们可以模拟一个类似的资源加载插件的使用案例。
通常情况下,Flutter中的资源加载可能涉及到加载图片、JSON数据或其他类型的文件。为了说明如何使用一个假设的 load
插件来加载资源,我将展示一个简化的示例,该示例使用了一个假想的 ResourceLoader
类,它有一个 load
方法用于加载资源。
假设的 ResourceLoader
类
首先,我们定义一个假设的 ResourceLoader
类,它有一个 load
方法,用于从应用程序的资源目录中加载文件内容。
import 'dart:io';
import 'dart:convert';
class ResourceLoader {
// 模拟加载资源的方法
Future<String> load(String filePath) async {
File file = File(filePath);
if (!await file.exists()) {
throw Exception("File not found: $filePath");
}
String contents = await file.readAsString();
return contents;
}
}
使用 ResourceLoader
加载 JSON 数据
接下来,我们展示如何使用这个 ResourceLoader
类来加载一个 JSON 文件,并将其解析为 Dart 对象。
假设我们有一个名为 data.json
的文件,其内容如下:
{
"name": "Flutter",
"version": "3.0.0"
}
我们可以创建一个 Dart 类来表示这个 JSON 数据结构:
class AppData {
String name;
String version;
AppData({required this.name, required this.version});
// 从 JSON 映射中创建 AppData 实例
factory AppData.fromJson(Map<String, dynamic> json) {
return AppData(
name: json['name'] as String,
version: json['version'] as String,
);
}
}
然后,我们使用 ResourceLoader
来加载并解析这个 JSON 文件:
import 'dart:convert';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Resource Loader Example'),
),
body: FutureBuilder<AppData>(
future: _loadAppData('assets/data.json'), // 假设 JSON 文件位于 assets 目录下
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
AppData data = snapshot.data!;
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Name: ${data.name}'),
Text('Version: ${data.version}'),
],
),
);
}
} else {
return CircularProgressIndicator();
}
},
),
),
);
}
Future<AppData> _loadAppData(String filePath) async {
ResourceLoader loader = ResourceLoader();
String jsonString = await loader.load(filePath);
Map<String, dynamic> jsonMap = jsonDecode(jsonString);
AppData appData = AppData.fromJson(jsonMap);
return appData;
}
}
注意:在 Flutter 中,通常资源文件(如 JSON 文件)会被放置在 assets
目录下,并且需要在 pubspec.yaml
文件中声明它们。然而,由于我们的 ResourceLoader
类是基于文件系统的,它实际上并不能直接加载 Flutter 的资产文件。在真实的应用中,你应该使用 Flutter 的 AssetBundle
来加载资产文件。
如果你确实想要模拟一个插件的行为,你可能需要创建一个真正的 Flutter 插件,它使用平台通道(platform channels)来与原生代码交互,以便在 Android 和 iOS 上加载资源。但上面的示例提供了一个基本的思路,展示了如何在 Dart 代码中模拟资源加载的过程。