Flutter原生功能扩展插件dartive的使用

Flutter原生功能扩展插件dartive的使用

Dartive 是一个类似于 ExpressJS 的 Dart 后端封装器,简化了定义路由和处理 HTTP 请求的过程。

特性

  • 路由处理:轻松直观地定义 GET、POST、PUT、DELETE 等路由。
  • 请求解析:使用内置的 JSON 解码和自定义数据模型解析传入的请求体。
  • 服务器配置:用一行代码自定义服务器主机和端口。

安装

pubspec.yaml 文件的依赖项中添加 Dartive:

dependencies:
  dartive: ^version

然后运行 dart pub get 来获取该包。

pub package

使用

基本使用

import 'package:dartive/dartive.dart';

void main(List<String> arguments) {
  // 定义一个 GET 路由
  Dartive.get('/', () {
    return {'message': 'Hello, world!'};
  });

  // 监听指定的主机和端口
  Dartive.listen(host: '0.0.0.0', port: 8080);
}

使用模型进行请求解析

首先定义一个数据模型 MyModel

class MyModel {
  final String name;
  final int age;

  MyModel({required this.name, required this.age});

  factory MyModel.fromJson(Map<String, dynamic> json) {
    return MyModel(
      name: json['name'],
      age: json['age'],
    );
  }
}

然后在主函数中使用该模型解析请求:

import 'dart:convert';
import 'package:dartive/dartive.dart';
import 'models/myModel.dart';

void main(List<String> arguments) {
  // 定义一个 POST 路由
  Dartive.post('/myEndpoint', (Dartive api) async {
    var body = api.request;
    var parsedData = json.decode(body).map((data) => MyModel.fromJson(data)).toList();
    List<MyModel> modelList = List<MyModel>.from(parsedData);
    return modelList[0];
  });

  // 监听指定的主机和端口
  Dartive.listen(host: '0.0.0.0', port: 8080);
}

运行 Dartive 与 Dartivemon

你可以使用 Dartivemon 来同时运行后端和前端,并启用热重载!

要使用 Dartivemon 运行 Dartive,请使用命令 dartivemon be [nameofapp.dart]。此命令会在特定文件夹中运行服务器。

推荐文件结构(FeBe)

什么是 FeBe?

FeBe(前端后端)是一个统一框架,简化了跨多个平台(iOS、Android、Web (WASM)、Linux 和 Windows)的开发过程,使用 Dart 和 Flutter。通过遵循 FeBe 框架来组织项目,你可以在前后端之间维护单一代码库,减少冗余并提高可维护性。

模型的单一来源真相

FeBe 的核心优势之一是它消除了为后端和前端分别维护不同模型的需求。传统上,你可能需要为后端定义一组模型,为前端定义另一组模型,这会导致重复工作和潜在的一致性问题。

FeBe 通过让你只定义一次数据模型并在整个应用程序中使用它们来解决这个问题。这不仅减少了你需要编写的代码量,还确保了应用的一致性和准确性。

多平台开发

开发可以在多个平台(iOS、Android、Web、Linux、Windows)上运行的应用程序一直是一个复杂且耗时的过程,通常需要为每个平台编写单独的代码库。

FeBe 通过利用 Dart 和 Flutter 的能力,从单一代码库构建多平台应用程序来简化这一过程。这意味着你可以编写一次代码,然后编译并部署到所有支持的平台上,节省时间和精力。

Dartive 与 Dartivemon

FeBe 集成了 Dartive(一个类似于 ExpressJS 的 Dart 后端封装器)和 Dartivemon(一个可以并发运行 Dart 和 Flutter 应用程序并监视你的 Dart 应用程序更改以自动重启的工具)。

文件结构

root
├── example
│   ├── flutter_app
│   ├── model
│   ├── app.dart (使用 dartivemon app.dart 运行)
│   └── lib
│       └── main.dart (使用 dartivemon app.dart 或 flutter run 运行)

更多关于Flutter原生功能扩展插件dartive的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter原生功能扩展插件dartive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dartive 是一个 Flutter 插件,它允许你在 Dart 代码中直接调用原生的 Android 和 iOS 功能。通过 dartive,你可以绕过一些使用 Flutter 官方方法时可能遇到的限制,直接与原生平台交互。这使得你能够更灵活地实现一些 Flutter 官方插件尚未提供的功能。

1. 安装 dartive

首先,你需要将 dartive 添加到你的 Flutter 项目中。在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  dartive: ^0.1.0  # 替换为最新版本

然后运行 flutter pub get 以安装依赖。

2. 初始化 dartive

在使用 dartive 之前,你需要在你的 Dart 代码中进行初始化。通常在 main.dart 文件中进行初始化:

import 'package:dartive/dartive.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Dartive.init();  // 初始化 Dartive
  runApp(MyApp());
}

3. 使用 dartive 调用原生功能

dartive 提供了几种方式来调用原生功能。你可以通过 MethodChannel 直接与原生代码交互,或者使用 dartive 提供的一些预定义的 API。

3.1 使用 MethodChannel

dartive 使用 MethodChannel 与原生平台通信。你可以通过 Dartive.invokeMethod 来调用原生方法。

import 'package:dartive/dartive.dart';

Future<void> callNativeMethod() async {
  try {
    final result = await Dartive.invokeMethod('your_native_method_name', {'key': 'value'});
    print('Native method result: $result');
  } catch (e) {
    print('Failed to invoke native method: $e');
  }
}

在原生代码中(Android 和 iOS),你需要实现对应的原生方法来处理这个调用。

3.2 使用预定义的 API

dartive 提供了一些预定义的 API,方便你快速调用常见功能。例如,你可以使用 Dartive.requestPermissions 来请求权限。

import 'package:dartive/dartive.dart';

Future<void> requestPermissions() async {
  try {
    final result = await Dartive.requestPermissions(['android.permission.CAMERA']);
    print('Permissions result: $result');
  } catch (e) {
    print('Failed to request permissions: $e');
  }
}

4. 原生代码实现

4.1 Android 实现

在 Android 项目中,你需要在 MainActivity 中实现 MethodChannel 的逻辑。

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "dartive";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler((call, result) -> {
                if (call.method.equals("your_native_method_name")) {
                    // 处理你的原生逻辑
                    String value = call.argument("key");
                    result.success("Received: " + value);
                } else {
                    result.notImplemented();
                }
            });
    }
}

4.2 iOS 实现

在 iOS 项目中,你需要在 AppDelegate 中实现 MethodChannel 的逻辑。

import UIKit
import Flutter

[@UIApplicationMain](/user/UIApplicationMain)
[@objc](/user/objc) class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "dartive", binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            if call.method == "your_native_method_name" {
                // 处理你的原生逻辑
                let value = call.arguments as? String
                result("Received: \(value ?? "")" as NSString)
            } else {
                result(FlutterMethodNotImplemented)
            }
        })
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}
回到顶部