التصنيفات
Flutter

افتح اتصال بين Flutter و الكود الاصلي باستخدام Pigeon

ببساطة Pigeon هو اداة تقوم بانشاء اكواد برمجية تسمح لك بالتواصل بين Android او IOS و Flutter. بحيث تكون الاكواد التي تم توليدها اليا تكون امنه وسهله للاستخدام. مازالت المكتبة في مرحلة التطوير وتقوم بتوليد شفرات برمجية خاصة بالجافا والاوبجكتيف سي وهذا بالتاكيد جميل لان الجافا تستطيع التواصل مع كوتلين وايضا اوبجكتف سي تتواصل مع سويفت.
تتميز هذه المكتبة بشيئين:
١- امنه للاستخدام type-safe.
٢- تقوم بمساعدتك على كتابة الكثير من الربمجيات اليا.

التثبيت:

في ملف pubspec.ymal سنقوم باضافة هذا السطر

dev_dependencies:
  pigeon: ^0.1.14

في Dart:

سنقوم بكتابة class بلغة dart في الروت الاساسي المشروع "خارج مجلد lib" والافضل ان تقوم بانشاء مجلد جديد في root وتقوم بتمسته pigeon حتى تقوم بترتيب ملفات المشروع.

import 'package:pigeon/pigeon.dart';

// الطلب
class AddRequest {
  int n1;
  int n2;
}

// النتائج
class AddReply {
  int result;
}

@HostApi()
abstract class Api {
  AddReply add(AddRequest req);
}

// اعدادات توليد الشغرة البرمجية
void configurePigeon(PigeonOptions opts) {
  opts.dartOut = 'lib/api_generated.dart';
  opts.javaOut = 'android/app/src/main/java/io/flutter/plugins/Pigeon.java';
  opts.javaOptions.package = "io.flutter.plugins";
  opts.objcHeaderOut = 'ios/Runner/Pigeon.h';
  opts.objcSourceOut = 'ios/Runner/Pigeon.m';
  opts.objcOptions.prefix = 'FLT';
}

في هذا الكود سنقوم بجمع عددين ،اعادة النتائج لـFlutter
الان سنقوم بتفعيل هذا الامر في terminal or cmd حتى تتبدا المكتبة بتوليد الاكواد الخاصة بـJava و Objective-C.

flutter pub run pigeon --input pigeon/schema.dart

الان تم توليد الملف الخاص بـDart. تستطيع استخدامه واستدعاء الاتصال في اي مكان في التطبيق ولكن في هذا المثال سنقوم باضافة في الشاشة الرئيسية.

home_page.dart
import './api_generated.dart';

void callNativeAdd () async {
  final api = Api();
  final req = AddRequest()
       ..n1 = 10
       ..n2 = 20;
  final reply = await api.add(req);
  print(reply.result); // prints 30
}

Kotlin:

سنتجه الان لنظام الاندرويد وسنقوم باضافة كود جافا في كوتلين "كوتلين تستطع التعامل والتواصل مع جافا" وسيكون بهذا الشكل

class MainActivity: FlutterActivity() {
    // 1. اضافة الكود الذي تم توليده للاتصال
    private class MyApi: Pigeon.Api {
        override fun add(arg: Pigeon.AddRequest): Pigeon.AddReply {
            val reply = Pigeon.AddReply()
            reply.result = arg.n1 + arg.n2
            return reply
        }
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        // 2. setup()تهيئة
        Pigeon.Api.setup(flutterEngine.dartExecutor.binaryMessenger, MyApi())
    }
}

سيقوم الاندرويد باعطائك علامة خطأ على هذا الكود وتحتاج فقط لتفعيل جافا 1.8 في ملف gradle الخاص بالتطبيق

android {
  ...
  kotlinOptions {
      jvmTarget = '1.8'
  } 
}

الان اصبح لدينا الكوتلين جاهز لاعادة البيانات وسنقوم الان بالتهيئة للـSwift.

Swift:

سنحتاج لاضافة ملف Objectiv-C في Swift واجراء تواصل بينهم بالشفرة التالية. وذلك باضافة الكود التالي في Runner-Bridging-Header.h

#import "Pigeon.h"

الان في ملف AppDelegate.swift سنقوم بكتابة الشفرة التالية.

 class MyApi: FLTApi {
     func add(_ input: FLTAddRequest, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) -> FLTAddReply? {
         let reply = FLTAddReply()
         let result = input.n1!.intValue + input.n2!.intValue
         reply.result = NSNumber.init(value: result)
         return reply
     }
 }

الان في AppDelegate سنقوم بتمرير البيانات والتواصل معها.

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController

     // Setupを呼ぶ
    FLTApiSetup(controller.binaryMessenger, MyApi())
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

الان عند تشغيل التطبيق ستظهر النتائج في التطبيق مباشرة.

المصدر:

https://qiita.com/sankentou/items/642fbe06f3664c1bf73d#kotlin-%E5%81%B4

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.