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
调用本地代码。- 平台文件夹(如
android
、ios
、windows
等):包含构建和捆绑本地代码库所需的构建文件。
构建与捆绑本地代码
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
更多关于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