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

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

本项目是一个新的Flutter FFI插件项目。通过此插件,可以在Dart代码中直接调用本地代码。

开始使用

这个项目是为一个Flutter FFI插件(一种包含本地代码并通过Dart FFI直接调用的专门包)提供的起点。

项目结构

该项目采用以下结构:

  • src:包含本地源代码及用于将这些源代码编译为动态库的CmakeFile.txt文件。
  • lib:包含定义插件API的Dart代码,并使用dart:ffi调用本地代码。
  • 平台文件夹(如androidioswindows等):包含构建和捆绑本地代码库所需的构建文件。

构建与捆绑本地代码

pubspec.yaml文件以如下方式指定FFI插件:

plugin:
  platforms:
    some_platform:
      ffiPlugin: true

这种配置会为各种目标平台调用本地构建,并将二进制文件捆绑到使用这些FFI插件的Flutter应用程序中。

可以结合dartPluginClass使用,例如当FFI用于实现联合插件的一个平台时:

plugin:
  implements: some_other_plugin
  platforms:
    some_platform:
      dartPluginClass: SomeClass
      ffiPlugin: true

插件可以同时具有FFI和方法通道:

plugin:
  platforms:
    some_platform:
      pluginClass: SomeName
      ffiPlugin: true

由FFI(及方法通道)插件调用的本地构建系统包括:

  • 对于Android:Gradle,它调用Android NDK进行本地构建。
  • 对于iOS和MacOS:Xcode,通过CocoaPods。
  • 对于Linux和Windows:CMake。

绑定到本地代码

要使用本地代码,需要在Dart中创建绑定。为了防止手动编写这些绑定,它们可以通过package:ffigen从头文件(src/native_add.h)生成。通过运行dart run ffigen --config ffigen.yaml来重新生成这些绑定。

调用本地代码

短时间运行的本地函数可以直接从任何隔离区调用。例如,参见lib/native_add.dart中的sum函数。

长时间运行的函数应该在一个辅助隔离区调用,以避免在Flutter应用程序中丢帧。例如,参见lib/native_add.dart中的sumAsync函数。

Flutter帮助

有关如何开始使用Flutter的帮助,请查看我们的在线文档,其中提供了教程、示例、移动开发指南和完整的API参考。

示例代码

以下是使用native_add_test_zeo插件的完整示例代码:

import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:native_add_test_zeo/native_add_test_zeo.dart' as native_add_test_zeo;

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late int sumResult;
  late Future<int> sumAsyncResult;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 调用本地函数sum
    sumResult = native_add_test_zeo.sum(1, 2);
    // 调用异步本地函数sumAsync
    sumAsyncResult = native_add_test_zeo.sumAsync(3, 4);
    // 调用本地函数printA
    native_add_test_zeo.printA(3);
    // 调用本地函数printHellotxt
    String msg = 't11';
    var isSame = native_add_test_zeo.printHellotxt(msg.toNativeUtf8() as Pointer<Char>);
    print(isSame);
    // 调用本地函数printCPP
    var isSame1 = native_add_test_zeo.printCPP(msg.toNativeUtf8() as Pointer<Char>);
    print(isSame1);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    const textStyle = TextStyle(fontSize: 25);
    const spacerSmall = SizedBox(height: 10);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Native Packages'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: [
                const Text(
                  'This calls a native function through FFI that is shipped as source in the package. '
                  'The native code is built as part of the Flutter Runner build.',
                  style: textStyle,
                  textAlign: TextAlign.center,
                ),
                spacerSmall,
                Text(
                  'sum(1, 2) = $sumResult',
                  style: textStyle,
                  textAlign: TextAlign.center,
                ),
                spacerSmall,
                FutureBuilder<int>(
                  future: sumAsyncResult,
                  builder: (BuildContext context, AsyncSnapshot<int> value) {
                    final displayValue = (value.hasData) ? value.data : 'loading';
                    return Text(
                      'await sumAsync(3, 4) = $displayValue',
                      style: textStyle,
                      textAlign: TextAlign.center,
                    );
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


native_add_test_zeo 是一个假设的 Flutter 插件名称,用于演示如何使用 Flutter 的原生功能扩展插件。在 Flutter 中,原生功能扩展插件通常用于调用平台特定的功能(如 Android 的 Java/Kotlin 或 iOS 的 Objective-C/Swift 代码)。

以下是如何使用 native_add_test_zeo 插件的步骤:

1. 添加插件依赖

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

dependencies:
  flutter:
    sdk: flutter
  native_add_test_zeo: ^1.0.0  # 假设插件版本为1.0.0

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

2. 导入插件

在 Dart 文件中导入插件:

import 'package:native_add_test_zeo/native_add_test_zeo.dart';

3. 使用插件功能

假设 native_add_test_zeo 插件提供了一个 add 方法,用于执行两个数的加法运算。你可以这样使用它:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化插件
  NativeAddTestZeo nativeAddTestZeo = NativeAddTestZeo();

  // 调用插件方法
  int result = await nativeAddTestZeo.add(3, 4);

  print('The result is: $result');  // 输出: The result is: 7
}

4. 处理平台代码

如果 native_add_test_zeo 插件需要调用原生代码,你需要确保插件已经正确配置了 Android 和 iOS 的平台代码。

Android

android/src/main/java/com/example/native_add_test_zeo/NativeAddTestZeoPlugin.java 文件中,可能会有类似以下的代码:

package com.example.native_add_test_zeo;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
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;

public class NativeAddTestZeoPlugin implements FlutterPlugin, MethodCallHandler {
  private MethodChannel channel;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "native_add_test_zeo");
    channel.setMethodCallHandler(this);
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("add")) {
      int a = call.argument("a");
      int b = call.argument("b");
      result.success(a + b);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}

iOS

ios/Classes/NativeAddTestZeoPlugin.m 文件中,可能会有类似以下的代码:

#import "NativeAddTestZeoPlugin.h"
#import <Flutter/Flutter.h>

@implementation NativeAddTestZeoPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
      methodChannelWithName:@"native_add_test_zeo"
            binaryMessenger:[registrar messenger]];
  NativeAddTestZeoPlugin* instance = [[NativeAddTestZeoPlugin alloc] init];
  [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
  if ([@"add" isEqualToString:call.method]) {
    NSNumber* a = call.arguments[@"a"];
    NSNumber* b = call.arguments[@"b"];
    result(@(a.intValue + b.intValue));
  } else {
    result(FlutterMethodNotImplemented);
  }
}
@end

5. 运行应用

确保你的 Flutter 应用已经正确配置了 Android 和 iOS 的环境,然后运行应用:

flutter run
回到顶部