Flutter高性能融合插件dart_fusion的使用

Flutter高性能融合插件dart_fusion的使用

Dart Fusion

一个旨在提升我的Dart项目性能的库,它包含了一组和谐的工具、实用程序和组件。

目录

安装

在你的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 打印此用法信息。

模型更新

根据给定的注解生成toJSONfromJSONcopyWith。运行以下命令:

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模型生成的类。

使用

模型

注解类作为生成fromJSONtoJSONcopyWith的指示器。

@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模型,包括copyWithtoJSONfromJSONtoString值。

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方法值的消息,如DELETEGETHEADOPTIONSPATCHPOSTPUT

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,如copyWithfromJSONtoJSON的运行器。

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非常直接。只需扩展该类,重写特定的方法如onStartonPreparationonFinish,让魔法发生。

  • 数据传递简化 通过方便的数据方法,可以轻松声明和传递数据,确保数据管理既高效又有序。

使用

要使用它,你需要像这样扩展这个类:

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

1 回复

更多关于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. 初始化插件

在应用的初始化阶段(例如MainActivityAppDelegate中,或者在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参考。

回到顶部