Dartnative beroperasi sebagai jembatan untuk berkomunikasi antara DART dan API asli.
Mengganti saluran flutter berkinerja rendah dengan kode yang lebih cepat dan lebih ringkas.
Dartnative memanggil API asli secara dinamis . Ini mendukung penyaluran sinkron dan asinkron.
Serialisasi parameter dan nilai pengembalian seperti saluran Flutter tidak lagi diperlukan. Dartnative memberikan panggilan langsung dan marshalling objek otomatis antara antarmuka bahasa.
DART FINISZER hanya didukung di atas Flutter 3 (DART 2.17), tetapi dengan Dartnative tersedia di Dart Flutter 2.2.0 (DART 2.13.0) dan UP.
Dartnative mendukung konversi tipe otomatis sehingga kode bridging -nya lebih pendek & lebih sederhana dari saluran flutter.
Desain dan visi paket ini:

| Versi Dartnative | Persyaratan flutter | Versi Codegen |
|---|---|---|
| 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
Tambahkan dart_native ke dependensi dan build_runner ke dev_dependencies. Maka Anda dapat menulis kode. Berikut beberapa contoh:
Kode panah:
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]);
}Kode Objective-C yang sesuai:
@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);
}
@endKode Java yang sesuai:
// 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 ;
}
}CATATAN: Jika jalur SO Anda kustom, Anda perlu melewati jalur tertentu.
DartNativePlugin . loadSoWithCustomPath ( "xxx/libdart_native.so" ); Dan sebelum menggunakan Dartnative in Dart, pertama -tama Invoke dartNativeInitCustomSoPath() . Ini akan mendapatkan jalur dari saluran.
Kode panah:
interface . setMethodCallHandler ( 'totalCost' ,
( double unitCost, int count, List list) async {
return { 'totalCost: ${ unitCost * count }' : list};
});Kode Objective-C yang sesuai:
[ self invokeMethod: @" totalCost "
arguments: @[@ 0.123456789 , @ 10 , @[ @" testArray " ]]
result: ^( id _Nullable result, NSError * _Nullable error) {
NSLog ( @" %@ " , result);
}];
Kode Java yang sesuai:
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.
});| Anak panah | Objektif-C | Cepat | Jawa |
|---|---|---|---|
| batal | nol | nol | batal |
| bool | Bool | Bool | bool |
| int | Nsinteger | Int | int |
| dobel | dobel | Dobel | dobel |
| Rangkaian | Nsstring | Rangkaian | Rangkaian |
| Daftar | Nsarray | Array | DAFTAR, ARRAYLIST |
| Peta | Nsdictionary | Kamus | Peta, hashmap |
| Mengatur | Nsset | Mengatur | Set, hashset |
| Fungsi | Memblokir | Penutup | Janji |
| Penunjuk | ruang kosong * | Unsafemutablerawpointer | - |
| NativeByte | Nsdata | Data | DirectByTeBuffer |
| NativeObject | NsObject | NsObject | Obyek |
Langkah 1: Tambahkan dart_native ke dependensi dan build_runner ke dev_dependencies.
Langkah 2: Hasilkan kode pembungkus DART dengan @dartnative/codegen atau tulis kode DART secara manual.
Langkah 3: Hasilkan kode untuk konversi tipe otomatis menggunakan DART_Native_Gen dengan langkah-langkah berikut (3.1-3.3):
3.1 Anotasi kelas pembungkus panah dengan @native .
@native
class RuntimeSon extends RuntimeStub {
RuntimeSon ([ Class isa]) : super ( Class ( 'RuntimeSon' ));
RuntimeSon . fromPointer ( Pointer < Void > ptr) : super . fromPointer (ptr);
} 3.2 Anotasi entri Anda sendiri (seperti main() ) dengan @nativeRoot .
@nativeRoot
void main () {
runApp ( App ());
}3.3 berjalan
flutter packages pub run build_runner build --delete-conflicting-outputs untuk menghasilkan file ke direktori sumber Anda.
Catatan: Kami sarankan berjalan clean terlebih dahulu:
flutter packages pub run build_runner clean Langkah 4: Hubungi fungsi autogenerasi di <generated-name>.dn.dart dalam 3.3. Nama fungsi ditentukan oleh name di pubspec.yaml .
@nativeRoot
void main () {
// Function name is generated by name in pubspec.yaml.
runDartNativeExample ();
runApp ( App ());
}Langkah 5: Maka Anda dapat menulis kode. Berikut beberapa contoh:
5.1 IOS:
Kode panah (dihasilkan):
// 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);
Kode Objective-C yang sesuai:
typedef int (^BarBlock)( NSObject *a);
@interface RuntimeStub
- ( CGRect ) fooCGRect : ( CGRect ) rect ;
- ( void ) fooBlock : (BarBlock) block ;
@endLebih banyak contoh iOS Lihat: ios_unit_test.dart
5.2 Android:
Kode panah (dihasilkan):
// new Java object.
RuntimeStub stub = RuntimeStub ();
// get java list.
List list = stub. getList ([ 1 , 2 , 3 , 4 ]);
// support interface.
stub. setDelegateListener ( DelegateStub ());
Kode Java yang sesuai:
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 );
}
}Lebih banyak contoh android lihat: android_unit_test.dart
Catatan: Jika Anda menggunakan DART_Native pada macOS, Anda harus menggunakan use_frameworks! di podfile Anda.
T: Gagal mencari simbol (dlsym (rtld_default, initdartapidl): simbol tidak ditemukan) di arsip macOS.
A: Pilih satu solusi:
use_frameworks! di podfile.Dartnative tersedia di bawah lisensi BSD 3-Clause. Lihat file lisensi untuk info lebih lanjut.