اذهب إلى المحتوى

السؤال

Recommended Posts

  • 1
نشر

يمكنك تشغيل كود بلغة java للاندرويد وبلغة swift للـIOS عن طريق الـmethod channels حيث تمكننا من إستدعاء دوال معرفة مسبقاً بلغة java وتلقي القيم المرجعة منها.
1.thumb.png.1cdbe5292a0b983568346defc1dbfc6f.png
لاحظ كيف يتم التواصل عبر الـchannels بين التطبيق والدوال الخاصة بالـandroid والـIOS.
لنأخذ مثالاً لتنفيذ كود بلغة java على الاندرويد لجلب معلومات عن الجهاز:

أولا يجب كتابة الكود الذي نريد استدعائه من خلال الـmethod channles، نذهب إلى الملف " MainActivity.java " الموجود في مجلد android/java حيث سيكون الملف كالتالي:

import io.flutter.embedding.android.FlutterActivity;

public class MainActivity extends FlutterActivity {

}

نقوم بإضافة التعديلات الموضحة في الكود التالي:

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import android.os.Build;

public class MainActivity extends FlutterActivity {
  private static final String CHANNEL = "com.myapp.getInfo"; // اسم القناة الخاصة بنا
  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
  super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
        .setMethodCallHandler(
          (call, result) -> {
            //سيتم تنفيذ الكود في الـ
            // main thread
	      if (call.method.equals("getManufacturer")) { // التحقق من إسم الدالة التي تم إستدعائها في حال كانت مطابقة
	      String manufacturer = Build.MANUFACTURER; // جلب إسم الشركة المصنعة
	      result.success(manufacturer); // إرجاع القيمة ليتم إستخدامها من قبل التطبيق
	      }
		
          }
        );
  }
}

بعد تعريف قناة خاصة بنا وهي " com.myapp.getInfo " وتعريف إسم الإستدعاء " getManufacturer" يمكننا الآن إستدعاء تلك الوظائف بلغة dart لترجع لنا إسم الشركة المصنعة للهاتف.
أولاً وقبل إستدعاء الدالة getManufacturer يجب تهيئة القناة الخاصة بنا كالتالي:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
//...
class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel('com.myapp.getInfo'); // تعريف القناة
  //...
  
}
//...

ثم نستدعي الدالة getManufacturer ونخزن القيمة المرجعة منها في متغير:

final String result = await platform.invokeMethod('getManufacturer'); // إستدعاء الدالة وتخزين القيمة المرجعة منها في متغير

وبذلك نكون قد كتبنا كود بلغة java وقمنا بإستدعائه عن طريق الـmethod channels.

  • 0
نشر

يمكنك إنشاء مشروع مخصص للأندرويد باستخدام flutter عن طريق الأمر التالي 

flutter create -i objc -a java nameProject

بحيث nameProject هي اسم المشروع الجديد المخصص للأندرويد. 

ثم إنشاء Channel مخصصة باستخدام الخاصية MethodChannel, طبعا يرتبط client و host المضيف للقناة من خلال اسم القناة الذي تم تمريره في منشئ القناة. و هنا يجب أن يكون جميع اسماء القنوات المستخدمة في تطبيق واحد فريدة أي لا تتكرر. 

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
...
class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel('flutter.native/helperchannel');
}

ومن ثم يتم استداعاء القناة 

String res = "";
try {
final String result = await  platform.invokeMethod('nativeCode');
res = result;
} on PlatformException catch (e) {

}

و من ثم في مجلد android نجد ملف MainActivity.java و من ثم إنشاء MethodChannel بنفس الاسم الذي أنشأناه في تطبيق flutter.

private static final String CHANNEL = "flutter.native/helperchannel";

 ومن ثم في دالة OnCreate علينا أنشاء MethodCallHandler

new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
	new MethodChannel.MethodCallHandler() {
	  @Override
	  public void onMethodCall(MethodCall call, MethodChannel.Result result) {
		if (call.method.equals("nativeCode")) {
		  String myCode = myCode();
		  result.success(myCode);
		}
	  }});

و أيضا ننشىء الدالة myCode في نفس الملف 

private String myCode() {
    return "print my Code";
  }
}

ومن ثم في Flutter نستطيع استدعاء أي دالة في MainActivity.java الخاصة بالاندرويد عن طريق القناة المعرفة مسبقا كما ذكرنا سلفاً.

كود main.dart كاملا 

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new HomePage(),
    );
  }
}
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Native Code from Dart'),
      ),
      body: new MyHomePage(),
    );
  }
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel('flutter.native/helperchannel');
  String responseCode = '';
  Future<void> responseMyCode() async {
    String res = "";
    try {
      final String result = await platform.invokeMethod('nativeCode');
      res = result;
    } on PlatformException catch (e) {
      
    }
    setState(() {
      responseCode = res;
    });
  }
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Center(
        child: Column(
          children: [
            RaisedButton(
              child: Text('get My Code'),
              onPressed: responseMyCode,
            ),
            Text(responseCode),
          ],
        ),
      ),
    );
  }
}

MainActivity.java

import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
  private static final String CHANNEL = "flutter.native/helperchannel";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodChannel.MethodCallHandler() {
              @Override
              public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                if (call.method.equals("nativeCode")) {
                  String myCode = myCode();
                  result.success(myCode);
                }
              }});
  }
private String myCode() {
    return "print my Code";
  }
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...