Flutter高性能融合插件dart_fusion的使用
Flutter高性能融合插件dart_fusion的使用
Dart Fusion
一个旨在提升我的Dart项目性能的库,它包含了一组和谐的工具、实用程序和组件。
目录
- Dart Fusion
- 安装
- 文档
- Dart Fusion CLI
- D Annotations
- D Assertions
- D Behavior
- D Builder
- D Exceptions
- D Extensions
- D Image
- D Log
- D Models
- D Overlay
- D Parse
- D Runner
- D Services
- D Typedefs
- D Widget
- D Change Builder
- D Provider
- D Tile Wrapper
安装
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
dart_fusion:
git:
url: https://github.com/Nialixus/dart_fusion.git
path: dart_fusion
ref: v3.1.7
# 或者对于flutter项目,导入以下依赖
dart_fusion_flutter:
git:
url: https://github.com/Nialixus/dart_fusion.git
path: dart_fusion_flutter
ref: v3.1.7
然后运行以下命令以激活插件:
dart pub global activate --source git https://github.com/Nialixus/dart_fusion.git
Dart Fusion CLI
Dart Fusion CLI 是一个命令行工具,用于简化常见的任务,如资源生成、模型更新和本地化。
使用
资源生成
通过扫描资源文件并生成到一个dart类中来轻松生成资源类。运行以下命令:
dart run dart_fusion asset
可用命令列表:
选项 | 描述 |
---|---|
-i, --input |
输入目录,其中包含资源文件。默认为assets 。 |
-o, --output |
输出文件,生成的资源类。默认为lib/src/assets.dart 。 |
-h, --help |
打印此用法信息。 |
模型更新
根据给定的注解生成toJSON
、fromJSON
和copyWith
。运行以下命令:
dart run dart_fusion model
可用命令列表:
选项 | 描述 |
---|---|
-i, --input |
输入目录,其中包含模型文件。默认为空字符串。 |
-h, --help |
打印此用法信息。 |
本地化
从JSON文件生成本地化类,简化了在Dart应用程序中管理自由翻译的过程。
dart run dart_fusion localize
可用命令列表:
选项 | 描述 |
---|---|
-i, --input |
输入目录,其中包含JSON基础翻译文件。默认为assets/translation/en.json 。 |
-o, --output |
生成JSON到easy_localization模型。 |
--from |
基础语言用于翻译。默认为en 。 |
--to |
目标翻译语言。默认为["af","sq","am","ar","hy","as","ay","az","bm","eu","be","bn","bho","bs","bg","ca","ceb","zh-CN","zh","zh-TW","co","hr","cs","da","dv","doi","nl","en","eo","et","ee","fil","fi","fr","fy","gl","ka","de","el","gn","gu","ht","ha","haw","he","hi","hmn","hu","is","ig","ilo","id","ga","it","ja","jv","kn","kk","km","rw","gom","ko","kri","ku","ckb","ky","lo","la","lv","ln","lt","lg","lb","mk","mai","mg","ms","ml","mt","mi","mr","mni-Mtei","lus","mn","my","ne","no","ny","or","om","ps","fa","pl","pt","pa","qu","ro","ru","sm","sa","gd","nso","sr","st","sn","sd","si","sk","sl","so","es","su","sw","sv","tl","tg","ta","tt","te","th","ti","ts","tr","tk","ak","uk","ur","ug","uz","vi","cy","xh","yi","yo","zu"] |
-h, --help |
打印此用法信息。 |
D Annotations
D Annotations是一组用于指示Dart Fusion CLI模型生成的类。
使用
模型
注解类作为生成fromJSON
、toJSON
和copyWith
的指示器。
@model
class MyClass extends DModel {}
// 或者你可以这样注解
@Model(immutable: true, copyWith: true, fromJSON: true, toJSON: true)
class MyClass extends DModel {}
变量
带有@Model
注解的模型类中的变量注解。
@variable
final DModel value;
// 或者你可以这样注解
@Variable(name: 'd_model', toJSON: true, fromJSON: true)
final DModel value;
运行以下命令后将生成类似以下内容的结果:
@model
class MyClass extends DModel {
const MyClass({required this.title, required this.value});
@Variable(name: 'd_model', toJSON: true, fromJSON: true)
final DModel value;
@variable
final String title;
@override
MyClass copyWith({DModel? value, String? title}) {
return MyClass(
value: value ?? this.value,
title: title ?? this.title,
);
}
@override
JSON get toJSON => {
'd_model': value.toJSON,
'title': title,
};
static MyClass fromJSON(JSON value) {
return MyClass(
value: DModel.fromJSON(value.of<JSON>('d_model')),
title: value.of<String>('title')
);
}
}
D Assertions
D Assertions是一组用于执行断言和验证的断言类。
断言
Assert
类基于布尔条件进行断言检查。如果断言失败,则抛出包含提供的消息的Exception
。
int number = 1;
Assert(
number.isEven, // 条件断言
'Number is not even!', // 如果条件返回false,则显示的消息
);
响应
专门的Assert
类用于处理与响应相关的断言。
return (context) {
final method = context.request.method;
Assert.response(
method == HttpMethod.post, // 断言检查
'Invalid Method!', // 如果条件返回false,则显示的消息
statusCode: 405, // 在`ResponseException`中发送的状态码
);
}
D Behavior
D Behavior是一个自定义滚动行为,用于控制可滚动小部件的滚动物理效果。
使用
ScrollConfiguration(
behavior: DBehavior(
physics: BouncingScrollPhysics()),
child: ListView(),
);
D Builder
D Builder是一个构建其子部件的小部件,使用自定义的构建函数和可选的数据。
使用
DBuilder(
data: {"name": "John", "age": 30},
builder: (context, data) {
final name = data.of<String>("name");
final age = data.of<int>("age");
return Text("My name is $name and I am $age years old.");
},
)
D Exceptions
D Exceptions是一组在库中使用的异常类。
类型异常
由于无法解析Type
而引起的异常。
throw TypeException(
message: 'Type is not available',
);
响应异常
包含Response
值的异常。
throw ResponseException(
response: Response(
statusCode: 404,
)
);
D Extensions
D Extensions是一组在Flutter项目中常用的扩展函数。
数字扩展
对数值类型(整数和双精度)进行扩展,添加限制值在指定范围内的实用方法。
Min
限制扩展值的最小值。
int min = 5.min(10);
print(min); // 10
Max
限制扩展值的最大值。
double max = 100.0.max(10.0);
print(max); // 10.0
Limit
在一定范围内限制扩展值。
int number = 75.limit(0, 100);
print(number); // 75
整数扩展
将整数转换为表示字节的人类可读字符串。
int bytes = 1048576;
String parse = bytes.toReadableBytes;
print(parse); // "1048.57 KB"
JSON扩展
对Map<String, dynamic>
值进行扩展。
Merge
合并一个JSON到另一个。
JSON json = {"primary": "1", "secondary": "2"};
JSON anotherJSON = {"primary": "10", "tertiary": "3"};
print(json.merge(anotherJSON)); // {"primary": "10", "secondary": "2", "tertiary": "3"}
Of
将JSON中的动态值解析为给定对象,并提供可选的错误回退。
JSON value = {"primary": "1"};
String primary = value.of<String>("primary");
print(primary); // "1"
String secondary = value.of<String>("secondary", "No Data");
print(secondary); // "No Data"
Maybe of
将JSON中的动态值解析为可选的给定对象。
JSON value = {"primary": "1"};
String? primary = value.maybeOf<String>("primary");
print(primary); // "1"
String? secondary = value.maybeOf<String>("secondary");
print(secondary); // null
BuildContext扩展
一组BuildContext
上的扩展集合。
Theme
调用Theme.of(context)
的快捷方式。
ThemeData theme = context.theme;
Color
调用Theme.of(context).colorScheme
的快捷方式。
ColorScheme color = context.color;
Text
调用Theme.of(context).textTheme
的快捷方式。
TextTheme text = context.text;
Query
调用MediaQuery.of(context)
的快捷方式。
MediaQuery query = context.query;
Size
调用MediaQuery.sizeOf(context)
的快捷方式。
Size size = context.querySize;
Width
调用MediaQuery.sizeOf(context).width
的快捷方式。
double width = context.width;
Height
调用MediaQuery.sizeOf(context).height
的快捷方式。
double height = context.height;
Is Phone
检查屏幕宽度是否小于400px。
bool isPhone = context.isPhone;
Is Desktop
检查屏幕宽度是否大于700px。
bool isDesktop = context.isDesktop;
Is Tablet
检查屏幕宽度是否小于400px且大于700px。
bool isTablet = context.isTablet;
RequestContext扩展
一组RequestContext
上的扩展集合。
Method
获取RequestContext
中的HttpMethod
的快捷方式。
HttpMethod method = context.method;
Is Get
检查请求方法是否为HttpMethod.get
。
bool isGET = context.isGET;
Is Post
检查请求方法是否为HttpMethod.post
。
bool isPOST = context.isPOST;
Is Put
检查请求方法是否为HttpMethod.put
。
bool isPUT = context.isPUT;
Is Delete
检查请求方法是否为HttpMethod.delete
。
bool isDELETE = context.isDELETE;
Is Web Socket
检查请求方法是否为http请求或websocket请求。
bool isWS = context.isWebSocket;
Parameter
获取RequestContext
中的参数的快捷方式。
JSON parameter = context.parameter;
Header
获取RequestContext
中的头信息的快捷方式。
JSON header = context.header;
JWT Verify
验证JWT Bearer Token的函数。
JWT jwt = await context.verify((key) => Env.read<String>(key));
列表扩展
一组BuildContext
上的扩展集合。
To
生成项目项的键索引和值。
List<String> texts = ["one", "two", "three"];
List<Widget> widgets = texts.to((index, item) => Text("$index: $item"));
Limit
安全地限制列表的长度。
List<int> integers = [1, 2, 3];
List<int> sublist = integers.limit(1, 100);
print(sublist); // [2, 3]
DModel列表扩展
扩展DModel
列表以获取其toJSON
值。
List<DModel> dmodels = [DModel(), DModel()];
List<JSON> jsons = dmodels.toJSON;
字符串扩展
大写字符串的第一个字母。
String word = 'magnificent'.capitalize;
print(word); // Magnificent
D Image
一个用于从不同来源显示矢量或位图图像的小部件。
使用
// 从文件加载矢量/位图图像
DImage(source: File('path/to/images.svg'))
// 从资产加载矢量/位图图像
DImage(source: 'assets/image/image.png');
// 从Uint8List加载矢量/位图图像
DImage(source: Uint8List());
// 从网络加载矢量/位图图像
DImage(source: 'http://image.dom/asset.svg');
D Log
一个简单的日志记录工具,用于打印具有可定制日志级别的日志消息。
使用
Exception e = Exception('something');
DLog(e); // Exception: something
D Models
一组DModel
模型。
D Model
基本的Dart模型,包括copyWith
、toJSON
、fromJSON
和toString
值。
class MyModel extends DModel {
@override
MyModel copyWith() {
return MyModel();
}
static MyModel fromJSON(JSON value) {
return MyModel();
}
@override
JSON get toJSON => {};
}
响应模型
每个Response
的基本模型,包含success
状态、message
和扩展DModel
类的data
。
ResponseModel(
success: true,
message: 'Successfully Fetching Data!',
data: const ResponseDataModel());
链接模型
在ResponseModel
中用于指示资源关系的链接引用。
LinkModel(
method: HttpMethod.get,
description: 'Read User Detail',
reference: '/user/123');
D Overlay
一个构建器小部件,用于显示覆盖层。
使用
final overlay = DOverlay(builder: (context, progress, controller) => YourWidget());
GestureDetector(
onTap: () {
overlay.controller.display(context);
}
);
D Parse
一个主要用于HTTP请求的解析工具。
HTTP方法消息
解析HTTP方法值的消息,如DELETE
、GET
、HEAD
、OPTIONS
、PATCH
、POST
或PUT
。
HttpMethod method = HttpMethod.get;
final message = DParse.httpMethodMessage(method.name);
print(message); // 'Data successfully loaded'
HTTP状态消息
解析statusCode
值的消息。
Response response = Response(...);
final message = DParse.httpStatusMessage(response.statusCode);
print(message); // 'Not Found: The requested resource could not be found'
异常消息
解析异常的消息。
FormatException exception = FormatException('Unexpected end of input (at character 1)');
final message = DParse.exceptionMessage(exception);
print(message); // 'Data is not exist'
D Runner
Dart Fusion CLI
的运行器类。
Asset Runner
扫描资源并将其转换为一个模型类的运行器。
Model Runner
完成DModel
,如copyWith
、fromJSON
和toJSON
的运行器。
Localization Runner
翻译Locale
并生成一个可以与easy_localization
集成的模型的运行器。
使用
在你的根main.dart
文件中设置:
void main() {
WidgetsFlutterBinding.ensureInitialized();
DartFusion.runner(const [AssetRunner(), ModelRunner(), LocalizeRunner()]);
runApp(...);
}
D Services
一组在Dart后端中最常用的的服务集合。
Middleware
处理Dart Frog
中的请求和响应的中间件。此中间件支持常规HTTP请求和websockets。
Handler middleware(Handler handler) {
return DService.middleware(
handler: handler,
certificate: (key) => Env.read(key)!,
data: ResponseDataModel.fromJSON,
);
}
Cors
定义跨域资源共享(CORS)策略的配置类。
Handler middleware(Handler handler) {
return handler.use(
Cors(
accessControlAllowOrigin: ['*'],
accessControlAllowMethods: [HttpMethod.get, HttpMethod.post],
accessControlAllowHeaders: [Header.contentType, Header.authorization],
accessControlAllowCredentials: false,
accessControlExposeHeaders: [Header.date],
accessControlMaxAge: Duration(hours: 24)
).handler,
);
}
Header
代表CORS策略中使用的头的抽象类。有98个子类继承此类。
Header header = ContentType();
print(header); // 'Content-Type'
随机ID
生成简单的随机密钥标识符。
String id = DService.randomID();
D Typedefs
一组在Dart中最常用的类型别名。
类型别名 | 原始类型 |
---|---|
JSON | Map<String, dynamic> |
D Widget
提供了一个解决方案,简化了使用StatefulWidget
时常见的样板代码。通过提供简洁高效的方案,提升了开发者的体验。设计时注重便捷性和简单性,AppStateWidget
简化了开发过程,让你能够专注于构建直观的用户界面,而不必陷入重复的代码中。
主要功能
-
减少样板代码 使用DWidget,可以显著减少使用StatefulWidget时的样板代码。告别冗长的代码块,迎接简洁优雅的声明。
-
提高可读性 通过抽象常见的模式,该库确保代码更清晰易读,使你更容易理解和维护项目。
-
易于使用 实现DWidget非常直接。只需扩展该类,重写特定的方法如
onStart
、onPreparation
、onFinish
,让魔法发生。 -
数据传递简化 通过方便的数据方法,可以轻松声明和传递数据,确保数据管理既高效又有序。
使用
要使用它,你需要像这样扩展这个类:
class MyClass extends DWidget {
const MyClass({super.key});
@override
Map<String, dynamic> data(DState state) {
return {'controller': TextEditingController()};
}
@override
void onPreparation(DState state) {
state.value<TextEditingController>('controller').text = 'Loading';
}
@override
Widget onStart(DState state) {
return TextField(controller: state.value<TextEditingController>('controller'));
}
void onReady(DState state) {
state.value<TextEditingController>('controller').text = 'Data Loaded';
}
@override
void onFinish(DState state) {
state.value<TextEditingController>('controller').dispose();
}
}
你也可以在它的子部件中获取[DState],通过调用:
DInherited.of(context);
或者通过调用获取[DState]中的数据:
context.value<TextEditingController>("controller");
设置setState
我们改为:
state.update();
D Change Builder
一个监听ChangeNotifier
变化的小部件,并根据变化重建其子部件。
使用
final changeNotifier = ScrollController();
return DChangeBuilder(
value: changeNotifier,
builder: (context, value, child) {
/* Your code here */
},
child: AnotherWidget(),
);
D Provider
一个通用的InheritedWidget
,用于向其后代提供对象。
使用
设置值:
DProvider<MyData>(
value: 'Test',
child: MyWidget(),
);
获取值:
var value = context.provider.value;
print(value); // 'Test'
D Tile Wrapper
围绕ExpansionTile
的包装器,用于监听其状态的变化。
使用
DTileWrapper((isExpanded) {
return ExpansionTile(...);
});
更多关于Flutter高性能融合插件dart_fusion的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter高性能融合插件dart_fusion的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter高性能融合插件dart_fusion
的使用,以下是一个基本的代码示例,展示如何在Flutter项目中集成和使用这个插件。请注意,dart_fusion
是一个假设的插件名称,实际使用中你需要根据具体插件的文档进行调整。以下代码旨在提供一个大致的框架。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加dart_fusion
插件的依赖。确保你已经连接到可以访问该插件的源(例如,pub.dev或者私有仓库)。
dependencies:
flutter:
sdk: flutter
dart_fusion: ^x.y.z # 替换为实际的版本号
2. 导入插件
在你的Dart文件中(例如main.dart
),导入dart_fusion
插件。
import 'package:flutter/material.dart';
import 'package:dart_fusion/dart_fusion.dart'; // 假设的导入路径
3. 初始化插件
在应用的初始化阶段(例如MainActivity
或AppDelegate
中,或者在Flutter的initState
方法中,取决于你的需求),初始化dart_fusion
插件。
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 初始化dart_fusion插件,这里假设有一个init方法
DartFusion.instance.init();
runApp(MyApp());
}
4. 使用插件功能
现在,你可以在你的Flutter应用中使用dart_fusion
插件提供的功能了。以下是一个简单的示例,展示如何调用插件的一个假设方法performHighPerformanceTask
。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Dart Fusion Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
try {
// 调用插件的某个高性能方法
var result = await DartFusion.instance.performHighPerformanceTask();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Result: $result')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: ${e.message}')),
);
}
},
child: Text('Run High Performance Task'),
),
),
),
);
}
}
5. 插件实现(假设)
以下是一个假设的dart_fusion
插件的实现示例,展示如何在原生代码(如Kotlin或Swift)中实现一个高性能任务,并通过MethodChannel与Flutter通信。
Kotlin (Android):
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.embedding.android.FlutterActivity
import android.os.AsyncTask
class DartFusionPlugin: FlutterPlugin, ActivityAware {
private lateinit var channel: MethodChannel
private var activity: FlutterActivity? = null
override fun onAttachedToEngine(flutterEngine: FlutterEngine) {
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "dart_fusion")
channel.setMethodCallHandler { call, result ->
if (call.method == "performHighPerformanceTask") {
AsyncTask.execute {
// 执行高性能任务
val resultData = performHighPerformanceComputation()
// 将结果返回给Dart
activity?.runOnUiThread {
result.success(resultData)
}
}
} else {
result.notImplemented()
}
}
}
override fun onDetachedFromEngine(flutterEngine: FlutterEngine) {
channel.setMethodCallHandler(null)
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activity = binding.activity as FlutterActivity?
}
override fun onDetachedFromActivityForConfigChanges() {
activity = null
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
activity = binding.activity as FlutterActivity?
}
override fun onDetachedFromActivity() {
activity = null
}
private fun performHighPerformanceComputation(): String {
// 假设的高性能计算
Thread.sleep(2000) // 模拟耗时操作
return "Computed Result"
}
}
Swift (iOS):
import Flutter
public class DartFusionPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "dart_fusion", binaryMessenger: registrar.messenger())
let instance = DartFusionPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "performHighPerformanceTask":
DispatchQueue.global(qos: .userInitiated).async {
let resultData = self.performHighPerformanceComputation()
DispatchQueue.main.async {
result(resultData)
}
}
default:
result(FlutterMethodNotImplementedError(methodName: call.method))
}
}
private func performHighPerformanceComputation() -> String {
// 假设的高性能计算
usleep(2_000_000) // 模拟耗时操作
return "Computed Result"
}
}
请注意,上述代码是一个简化的示例,用于展示如何在Flutter中集成和使用一个高性能插件。实际使用中,你可能需要根据插件的具体功能和API进行调整。务必参考插件的官方文档以获取详细的集成指南和API参考。