Flutter类型注册插件type_register的使用

Flutter类型注册插件type_register的使用

Type Register Generator

pub package

用于创建帮助函数以注册Hive类型的代码生成器。它将为带有@HiveType注解的类型生成名为registerAdapters的方法,并包含所有Hive适配器。

开始使用

在你的pubspec.yaml文件中添加以下依赖:

dev_dependencies:
  hive_generator: latest
  type_register: latest

然后运行以下命令:

dart run build_runner build -d

默认情况下,它将在lib文件夹内生成一个名为register_adapters.dart的文件。

如果你想更改输出位置,可以在项目的根目录下创建一个build.yaml文件,并添加以下内容:

targets:
  $default:
    builders:
      type_register|type_register:
        options:
          output_path: lib/src/core/

输出

生成的register_adapters.dart文件内容如下:

import 'package:example/another_model.dart';
import 'package:example/model.dart';
import 'package:hive_local_storage/hive_local_storage.dart'; 

void registerAdapters() {
  Hive.registerAdapter<AnotherModel>(AnotherModelAdapter()); // 注册AnotherModel的适配器
  Hive.registerAdapter<Model>(ModelAdapter()); // 注册Model的适配器
}

完整示例

main.dart

// 导入必要的库
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

// 导入自定义适配器
import 'lib/register_adapters.dart';

void main() async {
  // 初始化Hive
  await Hive.initFlutter();

  // 调用注册适配器的方法
  registerAdapters();

  // 打开Box
  var box = await Hive.openBox('myBox');

  // 添加数据
  box.put('key', AnotherModel(name: 'kishor', age: 27));

  // 获取数据
  var value = box.get('key');
  print(value.name); // 输出: kishor
  print(value.age);  // 输出: 27

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Hive Example")),
        body: Center(child: Text("Data stored using Hive!")),
      ),
    );
  }
}

更多关于Flutter类型注册插件type_register的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter类型注册插件type_register的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,类型注册插件(type_register)通常用于在不同平台(如iOS和Android)上注册特定的数据类型,以便在插件或应用中跨平台传递数据。尽管Flutter官方并没有一个直接名为type_register的通用插件,但我们可以基于概念构建一个示例,展示如何在Flutter插件中注册和使用自定义数据类型。

下面是一个简化的示例,展示如何在Flutter插件中注册和使用自定义数据类型。这个示例将包括Flutter插件的基本结构,以及如何在原生平台(iOS和Android)上注册和使用这些类型。

Flutter 插件结构

  1. 创建 Flutter 插件

    使用以下命令创建一个新的 Flutter 插件:

    flutter create --org com.example --template=plugin my_type_register_plugin
    cd my_type_register_plugin
    
  2. 定义自定义数据类型

    lib/my_type_register_plugin.dart 中定义一个自定义数据类型,比如一个包含名称和年龄的类:

    class Person {
      String name;
      int age;
    
      Person({required this.name, required this.age});
    
      Map<String, dynamic> toMap() {
        return {'name': name, 'age': age};
      }
    
      factory Person.fromMap(Map<String, dynamic> map) {
        return Person(
          name: map['name'] as String,
          age: map['age'] as int,
        );
      }
    }
    
  3. 在原生平台注册类型

    iOS 平台

    ios/Classes/MyTypeRegisterPlugin.swift 中,注册并使用 Person 类型。由于 Dart 与 Swift 之间没有直接的类型映射,我们需要手动处理数据传递:

    import Flutter
    
    public class MyTypeRegisterPlugin: NSObject, FlutterPlugin {
      public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(name: "my_type_register_plugin", binaryMessenger: registrar.messenger())
        let instance = MyTypeRegisterPlugin()
        instance.setup(channel: channel, registrar: registrar)
      }
    
      public func setup(channel: FlutterMethodChannel, registrar: FlutterPluginRegistrar) {
        channel.setMethodCallHandler({
          (call: FlutterMethodCall, result: @escaping FlutterResult) in
          guard call.method == "sendPerson" else {
            result(FlutterMethodNotImplemented)
            return
          }
    
          guard let personDict = call.arguments as? [String: Any],
                let name = personDict["name"] as? String,
                let age = personDict["age"] as? Int else {
            result(FlutterError(code: "InvalidArguments", message: "Invalid arguments passed to sendPerson", details: nil))
            return
          }
    
          // 在这里处理接收到的 Person 数据
          print("Received person: \(name), age: \(age)")
    
          result(success: true)
        })
      }
    }
    

    Android 平台

    android/src/main/java/com/example/my_type_register_plugin/MyTypeRegisterPlugin.java 中,同样注册并使用 Person 类型:

    package com.example.my_type_register_plugin;
    
    import android.content.Context;
    import androidx.annotation.NonNull;
    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.BinaryMessenger;
    import io.flutter.plugin.common.MethodCall;
    import io.flutter.plugin.common.MethodChannel;
    import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
    import io.flutter.plugin.common.MethodChannel.Result;
    import java.util.HashMap;
    import java.util.Map;
    
    public class MyTypeRegisterPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
      private MethodChannel channel;
      private Context applicationContext;
    
      @Override
      public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        applicationContext = flutterPluginBinding.getApplicationContext();
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "my_type_register_plugin");
        channel.setMethodCallHandler(this);
      }
    
      @Override
      public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("sendPerson")) {
          Map<String, Object> personMap = (Map<String, Object>) call.arguments;
          String name = (String) personMap.get("name");
          int age = (int) personMap.get("age");
    
          // 在这里处理接收到的 Person 数据
          System.out.println("Received person: " + name + ", age: " + age);
    
          result.success(true);
        } else {
          result.notImplemented();
        }
      }
    
      // 其他必要的方法,如 onDetachedFromEngine 和 onReattachedToActivity,可以按需添加
    }
    
  4. 在 Flutter 应用中使用插件

    在你的 Flutter 应用中,使用你创建的插件并发送 Person 数据:

    import 'package:flutter/material.dart';
    import 'package:my_type_register_plugin/my_type_register_plugin.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Plugin example app'),
            ),
            body: Center(
              child: ElevatedButton(
                onPressed: () async {
                  Person person = Person(name: "John Doe", age: 30);
                  await MyTypeRegisterPlugin.sendPerson(person.toMap());
                },
                child: Text('Send Person'),
              ),
            ),
          ),
        );
      }
    }
    

在这个示例中,我们创建了一个自定义的 Person 类型,并在原生平台(iOS 和 Android)上注册了一个方法来接收和处理这个类型的数据。请注意,这只是一个简化的示例,实际应用中可能需要更复杂的错误处理和类型映射。

回到顶部