تعمل Dartnative كجسر للتواصل بين DART و APIs الأصلية.
يحل محل قناة الرفرفة منخفضة الأداء برمز أسرع وأكثر إيجازًا.
يدعو dartnative أي واجهة برمجة تطبيقات أصلية ديناميكيا . وهو يدعم كل من التوجيه المتزامن وغير المتزامن.
لم يعد التسلسل للمعلمات وقيم الإرجاع مثل قناة Flutter مطلوبة. يوفر Dartnative مكالمات مباشرة وحشد كائن تلقائي بين واجهات اللغة.
يتم دعم Dart Finalizer فقط فوق Flutter 3 (Dart 2.17) ، ولكن مع Dartnative ، يتوفر في Dart Flutter 2.2.0 (Dart 2.13.0) وما فوق.
يدعم Dartnative تحويل النوع التلقائي بحيث يكون رمز التجسير أقصر وأبسط من قناة Flutter.
تصميم ورؤية هذه الحزمة:

| نسخة dartnative | متطلبات الرفرفة | إصدار Codegen |
|---|---|---|
| 0.4.x - 0.7.x | رفرفة 2.2.0 (Dart 2.13.0) | 2.x |
| 0.3.x | رفرفة 1.20.0 (دارت 2.9.1) | 1.2.x |
| 0.2.x | رفرفة 1.12.13 (DART 2.7) | 1.x |
iOS & Macos و Android
أضف dart_native إلى التبعيات و build_runner إلى dev_dependencies. ثم يمكنك كتابة الرمز. فيما يلي بعض الأمثلة:
رمز السهام:
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]);
}رمز الهدف المقابل:
@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رمز جافا المقابل:
// 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" ); وقبل استخدام dartnative في DART ، استدعاء أولاً dartNativeInitCustomSoPath() . سوف تحصل على المسار من القناة.
رمز السهام:
interface . setMethodCallHandler ( 'totalCost' ,
( double unitCost, int count, List list) async {
return { 'totalCost: ${ unitCost * count }' : list};
});رمز الهدف المقابل:
[ self invokeMethod: @" totalCost "
arguments: @[@ 0.123456789 , @ 10 , @[ @" testArray " ]]
result: ^( id _Nullable result, NSError * _Nullable error) {
NSLog ( @" %@ " , result);
}];
رمز جافا المقابل:
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
}
}
); 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.
});| دارت | الهدف-C | سريع | جافا |
|---|---|---|---|
| باطل | لا شيء | لا شيء | باطل |
| بول | بول | بول | بول |
| int | nsinteger | int | int |
| مزدوج | مزدوج | مزدوج | مزدوج |
| خيط | NSString | خيط | خيط |
| قائمة | nsarray | صفيف | قائمة ، arraylist |
| رسم خريطة | NSDictionary | قاموس | الخريطة ، hashmap |
| تعيين | NSSET | تعيين | مجموعة ، hashset |
| وظيفة | حاجز | إنهاء | يعد |
| مؤشر | فارغ * | Unsafemutablerawpointer | - |
| الأصلي | NSDATA | بيانات | DirectBytebuffer |
| NativeObject | nsobject | nsobject | هدف |
الخطوة 1: أضف dart_native إلى التبعيات و build_runner إلى Dev_Dependencies.
الخطوة 2: إنشاء رمز غلاف Dart مع @dartnative/codegen أو كتابة رمز 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 < Void > ptr) : 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: استدعاء الدالة Autogenerated في <generated-name>.dn.dart في 3.3. يتم تحديد اسم الوظيفة name في pubspec.yaml .
@nativeRoot
void main () {
// Function name is generated by name in pubspec.yaml.
runDartNativeExample ();
runApp ( App ());
}الخطوة 5: ثم يمكنك كتابة الرمز. فيما يلي بعض الأمثلة:
5.1 iOS:
رمز السهام (تم إنشاؤه):
// 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);
رمز الهدف المقابل:
typedef int (^BarBlock)( NSObject *a);
@interface RuntimeStub
- ( CGRect ) fooCGRect : ( CGRect ) rect ;
- ( void ) fooBlock : (BarBlock) block ;
@endالمزيد من أمثلة iOS انظر: iOS_UNIT_TEST.DART
5.2 Android:
رمز السهام (تم إنشاؤه):
// new Java object.
RuntimeStub stub = RuntimeStub ();
// get java list.
List list = stub. getList ([ 1 , 2 , 3 , 4 ]);
// support interface.
stub. setDelegateListener ( DelegateStub ());
رمز جافا المقابل:
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 انظر: Android_Unit_test.dart
ملاحظة: إذا كنت تستخدم Dart_Native على MacOS ، فيجب عليك استخدام use_frameworks! في podfile الخاص بك.
س: فشل في البحث عن الرمز (DLSYM (RTLD_DEFAULT ، initdartapidl): رمز غير موجود) على أرشيف MACOS.
ج: حدد حل واحد:
use_frameworks! في Podfile.يتوفر Dartnative بموجب ترخيص BSD 3-Cause. انظر ملف الترخيص لمزيد من المعلومات.