Flutter原生代码生成插件dart_native_gen的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter原生代码生成插件dart_native_gen的使用

dart_native_gen

dart_native_gen 是一个用于 dart_native 的注解工具。它通过 source_gen 实现自动类型转换。

描述

dart_native_gen 提供了一种基于注解的解决方案,通过 source_gen 实现 Dart 和原生代码之间的自动类型转换,从而简化了跨平台开发过程中的数据处理。

入门指南

示例代码

以下是一个完整的示例代码,展示了如何使用 dart_native_gen

import 'package:flutter/material.dart';
import 'package:dart_native_gen_example/main.dn.dart';
import 'package:dart_native_gen/dart_native_gen.dart';

// 使用 [@nativeRoot](/user/nativeRoot) 注解标记主函数
[@nativeRoot](/user/nativeRoot)
void main() {
  // 运行示例程序
  runDartNativeGenExample();
  // 启动 Flutter 应用
  runApp(MyApp());
}

// 定义 Flutter 应用的根组件
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

// 定义首页状态管理类
class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

// 定义首页状态类
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      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),
      ),
    );
  }
}

步骤说明

  1. 引入必要的包:

    import 'package:flutter/material.dart';
    import 'package:dart_native_gen_example/main.dn.dart';
    import 'package:dart_native_gen/dart_native_gen.dart';
    
  2. 使用 [@nativeRoot](/user/nativeRoot) 注解标记主函数:

    [@nativeRoot](/user/nativeRoot)
    void main() {
      runDartNativeGenExample();
      runApp(MyApp());
    }
    
  3. 定义 Flutter 应用的根组件:

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
  4. 定义首页状态管理类:

    class MyHomePage extends StatefulWidget {
      MyHomePage({Key? key, required this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
  5. 定义首页状态类:

    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          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),
          ),
        );
      }
    }
    

更多关于Flutter原生代码生成插件dart_native_gen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter原生代码生成插件dart_native_gen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,dart_native_gen 是一个用于自动生成 Flutter 原生代码(iOS 和 Android)的插件,以简化与原生平台的交互。以下是如何在 Flutter 项目中使用 dart_native_gen 的一个示例。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 dart_native_gen 依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_native_gen: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

2. 配置 build.yaml

在项目的根目录下创建或编辑 build.yaml 文件,配置 dart_native_gen

targets:
  $default:
    builders:
      dart_native_gen:
        generate_for:
          include: ["lib/native_interface/*.dart"]  # 指定需要生成原生代码的 Dart 文件路径
        options:
          output_dir: lib/generated  # 指定生成的原生代码存放的目录

3. 创建 Dart 接口文件

lib/native_interface/ 目录下创建一个 Dart 文件,例如 my_native_interface.dart

import 'package:dart_native_gen/dart_native_gen.dart';

@NativeClass()
class MyNativeInterface {
  @NativeMethod()
  Future<String> helloFromNative();
}

4. 生成原生代码

在命令行中运行以下命令来生成原生代码:

flutter pub run build_runner build

这将在 lib/generated/ 目录下生成对应的 iOS 和 Android 原生代码文件。

5. 实现原生方法

iOS (Swift)

在 Xcode 中打开 Runner 项目,并找到生成的 MyNativeInterface+Generated.swift 文件,实现 helloFromNative 方法:

import Foundation

@objc(MyNativeInterface) class MyNativeInterface: NSObject {
    @objc static func helloFromNative() -> Promise<String> {
        return Promise<String> { resolve, reject in
            resolve("Hello from Native iOS!")
        }
    }
}

Android (Kotlin)

在 Android Studio 中打开 Runner 项目,并找到生成的 MyNativeInterfaceGenerated.kt 文件,实现 helloFromNative 方法:

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.MethodChannel
import android.app.Activity
import android.content.Context

class MyNativeInterfaceGenerated(private val context: Context, private val flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) : MethodChannel.MethodCallHandler {
    private val channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.example.yourapp/my_native_interface")

    init {
        channel.setMethodCallHandler(this)
    }

    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == "helloFromNative") {
            result.success("Hello from Native Android!")
        } else {
            result.notImplemented()
        }
    }
}

注意:上述 Kotlin 代码是一个简化的示例,实际项目中可能需要更多的设置来注册插件和通道。

6. 使用生成的接口

现在你可以在 Flutter 代码中使用生成的接口了:

import 'package:flutter/material.dart';
import 'generated/my_native_interface.dart'; // 导入生成的接口

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late MyNativeInterface _nativeInterface;

  @override
  void initState() {
    super.initState();
    _nativeInterface = MyNativeInterface();
    _nativeInterface.helloFromNative().then((message) {
      print(message);  // 输出: Hello from Native iOS! 或 Hello from Native Android!
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Native Code Gen Demo'),
        ),
        body: Center(
          child: Text('Check the console for native message.'),
        ),
      ),
    );
  }
}

以上示例展示了如何使用 dart_native_gen 来自动生成 Flutter 原生代码并调用原生方法。请根据项目的具体需求进行相应的调整。

回到顶部