首页 > 其他分享 >Flutter OHOS flutter_dart_native

Flutter OHOS flutter_dart_native

时间:2024-12-18 09:21:54浏览次数:4  
标签:return 代码 Dart flutter dart Flutter native

DartNative

DartNative 作为 Dart 和原生 API 之间沟通的桥梁。

用更快、更简洁的代码替换性能低下的 Flutter 通道。

特征

动态同步和异步通道

DartNative动态调用任何原生 API 。它支持同步和异步通道。

多语言接口直接调用

不再需要像 Flutter Channel 那样对参数和返回值进行序列化,DartNative 提供了语言接口之间的直接调用和自动对象编组。

Dart finalizer

Dart finalizer 仅支持 Flutter 3(Dart 2.17)以上版本,但 DartNative 可在 Dart Flutter 2.2.0(Dart 2.13.0)及更高版本中使用。

自动生成简洁的桥接代码

DartNative 支持自动类型转换,因此其桥接代码比 Flutter 通道更短更简单。

此包的设计和愿景:

要求

DartNative 版本 Flutter 要求 代码生成版本
0.4.x - 0.7.x Flutter 2.2.0(Dart 2.13.0) 2.x
0.3.x Flutter 1.20.0(Dart 2.9.1) 1.2.x
0.2.x Flutter 1.12.13(Dart 2.7) 1.x

支持的平台

iOS、macOS 和 Android

用法

基本用法:接口绑定

添加dart_native到依赖项和build_runnerdev_dependencies。然后你就可以编写代码了。以下是一些示例:

Dart 调用 Native

Dart code:

final interface = Interface("MyFirstInterface");
// Example for string type.
String helloWorld() {
return interface.invokeMethodSync('hello', args: ['world']);
}
// Example for num type.
Future<int> sum(int a, int b) {
return interface.invokeMethod('sum', args: [a, b]);
}

相应的Objective-C代码:

@implementation DNInterfaceDemo

// Register interface name.
InterfaceEntry(MyFirstInterface)

// Register method "hello".
InterfaceMethod(hello, myHello:(NSString *)str) {
    return [NSString stringWithFormat:@"hello %@!", str];
}

// Register method "sum".
InterfaceMethod(sum, addA:(int32_t)a withB:(int32_t)b) {
return @(a + b);
}

@end

对应的Java代码:

// load libdart_native.so
DartNativePlugin.loadSo();

@InterfaceEntry(name = "MyFirstInterface")
public class InterfaceDemo extends DartNativeInterface {

@InterfaceMethod(name = "hello")
public String hello(String str) {
return "hello " + str;
}

@InterfaceMethod(name = "sum")
public int sum(int a, int b) {
return a + b;
}
}

注意:如果您的路径是自定义的,则需要传递特定路径。

DartNativePlugin.loadSoWithCustomPath("xxx/libdart_native.so");

在 dart 中使用 DartNative 之前,首先调用dartNativeInitCustomSoPath()。它将从通道中获取路径。

Native 调用 Dart

Dart code:

interface.setMethodCallHandler('totalCost',
(double unitCost, int count, List list) async {
return {'totalCost: ${unitCost * count}': list};
});

相应的Objective-C代码:

[self invokeMethod:@"totalCost"
         arguments:@[@0.123456789, @10, @[@"testArray"]]
            result:^(id _Nullable result, NSError * _Nullable error) {
    NSLog(@"%@", result);
}];

对应的Java代码:

invokeMethod("totalCost", new Object[]{0.123456789, 10, Arrays.asList("hello", "world")},
 new DartNativeResult() {
@Override
public void onResult(@Nullable Object result) {
Map retMap = (Map) result;
// do something
}

@Override
public void error(@Nullable String errorMessage) {
// do something
}
  }
);

Dart finalizer

final foo = Bar(); // A custom instance.
unitTest.addFinalizer(() { // register a finalizer callback.
  print('The instance of \'foo\' has been destroyed!'); // When `foo` is destroyed by GC, this line of code will be executed.
});

高级用法:动态调用方法

  • 步骤 1:添加dart_native依赖项和build_runnerdev_dependencies。

  • 第 2 步:使用@dartnative/codegen生成 Dart 包装器代码或手动编写 Dart 代码。

  • 步骤 3:使用dart_native_gen生成自动类型转换的代码,步骤如下(3.1-3.3):

    • 3.1 用 注释 Dart 包装器类@native。
    @native
class RuntimeSon extends RuntimeStub {
  RuntimeSon([Class isa]) : super(Class('RuntimeSon'));
  RuntimeSon.fromPointer(Pointer<Voidptr) : super.fromPointer(ptr);
}
  • 3.2 用 注释您自己的条目(例如main())@nativeRoot。

    @nativeRoot
    

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

  • 3.3 运行

    flutter packages pub run build_runner build --delete-conflicting-outputs

    将文件生成到您的源目录中。

    注意:我们建议clean先运行:

    flutter packages pub run build_runner clean

  • 步骤4:调用3.3中自动生成的函数。函数名由中.dn.dart确定。namepubspec.yaml
@nativeRoot
void main() {
  // Function name is generated by name in pubspec.yaml.
  runDartNativeExample(); 
  runApp(App());
}
  • 步骤5:然后就可以编写代码了。以下是一些示例:

    • 5.1 iOS:

      Dart 代码(生成):

// new Objective-C object.
RuntimeStub stub = RuntimeStub();

// Dart function will be converted to Objective-C block.
stub.fooBlock((NSObject a) {
print('hello block! ${a.toString()}');
return 101;
});

// support built-in structs.
CGRect rect = stub.fooCGRect(CGRect(4, 3, 2, 1));
print(rect);

相应的Objective-C代码:

typedef int(^BarBlock)(NSObject *a);

@interface RuntimeStub

- (CGRect)fooCGRect:(CGRect)rect;
- (void)fooBlock:(BarBlock)block;

@end


More iOS examples see: [ios_unit_test.dart](/dart_native/example/lib/ios/unit_test.dart)
  • 5.2 Android:

    Dart 代码(生成):

// new Java object.
RuntimeStub stub = RuntimeStub();

// get java list.
List list = stub.getList([1, 2, 3, 4]);

// support interface.
stub.setDelegateListener(DelegateStub());

对应的Java代码:

public class RuntimeStub {

public List<Integer> getList(List<Integer> list) {
List<Integer> returnList = new ArrayList<>();
returnList.add(1);
returnList.add(2);
return returnList;
}

public void setDelegateListener(SampleDelegate delegate) {
delegate.callbackInt(1);
}
}

更多android示例参见:https://gitee.com/openharmony-sig/flutter_dart_native/blob/master/dart_native/example/lib/android/unit_test.dart

注意:如果您在 macOS 上使用 dart_native,则必须use_frameworks!在 Podfile 中使用。

标签:return,代码,Dart,flutter,dart,Flutter,native
From: https://www.cnblogs.com/hongmengos/p/18613862

相关文章

  • Flutter OHOS flutter appscheme插件
    FlutterAppScheme配置说明1、Android端配置说明在您项目中Android的AndroidManifest.xml文件中按照如下规范添加Scheme,例如android/app/src/main/AndroidManifest.xmla、在需要启动的Activity中新增以下格式的代码<!--AndroidScheme--><intent-filter><actionandro......
  • 四大跨平台开发框架深度解析——uniapp、uniapp-X、React Native与Flutter
    引言随着移动互联网的飞速发展,跨平台开发框架成为了开发者们关注的焦点。这些框架旨在通过编写一套代码,实现多个平台的应用开发,从而大幅提高开发效率和降低维护成本。本文将深入剖析uniapp、uniapp-X、ReactNative和Flutter这四个主流的跨平台开发框架,探讨它们的优缺点及......
  • React Native学习路线图
    ‌ReactNative是由Facebook开发的一个开源框架,它允许开发者使用JavaScript(或TypeScript)和React来构建移动应用程序。通过提供一个共享的代码库,它能够为iOS和Android两个平台构建应用程序,从而显著减少开发时间和工作量。获取路线图你可以下载OpenLinkSaas客户端,......
  • 微信native支付对接案例详解
    微信native支付对接案例详解效果展示native支付产品介绍接入前准备开发指引API列表支付通知开发者社区整体原则就是按照官方文档一步一步来支付产品微信认证注意:只有服务号才能对接微信支付。每年都需要花300块认证费用。......
  • 基于 chat-uikit-react-native 实现一个 React Native 聊天 App
    一、前言本文分享了通过github源码快速实现一个聊天App。二、具体步骤Step1:配置开发环境如果您电脑没有ReactNative开发环境,请先按照ReactNative官网set-up-your-environment配置开发环境.Step2:下载源码Demo源码可前往github下载Step3:获取应用信息......
  • Dart Flutter教程_Dart Flutter3.x入门实战视频教程-16讲后是Flutter教程
    DartFlutter教程_DartFlutter3.x入门实战视频教程-16讲后是Flutter教程https://www.bilibili.com/video/BV1S4411E7LY/2P101Dart介绍WinMac上面分别搭建Dart...Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用和物联网等领域的开发。Dart诞生于201......
  • Flutter从入门到高级进阶
    Flutter从入门到高级进阶https://www.bilibili.com/video/BV19x4y1R7LEP1环境搭建P2创建Flutter工程&Flutter优势flutter2.5.3appdart代码module混合开发plugin第三包原生和dartpackage第三包dartname下划线Flutter:效率高!!不依赖UI!!高度统一!!渲染引擎—》Dart......
  • Flutter20个小实例免费视频教程
    Flutter20个小实例免费视频教程https://www.bilibili.com/video/BV1kt411B7muP101节底部导航栏和切換效果的制作-1Scaffold脚手架动态flutter快捷键stfulP202节底部导航栏和切换效果的制作-2import'package:flutter/material.dart';import'pages/airplay_screen.dart......
  • Flutter好客租房项目
    Flutter好客租房项目https://www.bilibili.com/video/BV18Q4y1o7nP48P11.1为什么学习flutter项目.1.1为什么学习flutter项目1.市场需要flutter--android和ios使用一套设计图,却需要两批人来开发。目前flutter开始支持web和桌面开发。2.Flutter使用更好的语......
  • flutter零基础教程: Dart 3.5语法 flutter3.24 2024年8月27日更新
    flutter零基础教程:Dart3.5语法flutter3.242024年8月27日更新https://www.bilibili.com/video/BV1RZ421p7BL7 142024-8edu.51cto.com/course/36476.htmlP1课程大纲介绍P2002课程使用方法介绍和笔记使用P3003_mac系统查看笔记软件的安装方法和…..P4004黑苹果系统的......