احمد صوالحة نشر 15 فبراير 2021 أرسل تقرير نشر 15 فبراير 2021 بما أن إطار العمل Flutter ينشئ تطبيقات native ويتعامل مع الـandroid والـIOS كل على حدة. إذاً كيف يمكنني أن أنفذ كود بلغة java على الـandroid فقط ؟ 2 اقتباس
1 Abdulraheem Barghouthi نشر 15 فبراير 2021 أرسل تقرير نشر 15 فبراير 2021 يمكنك تشغيل كود بلغة java للاندرويد وبلغة swift للـIOS عن طريق الـmethod channels حيث تمكننا من إستدعاء دوال معرفة مسبقاً بلغة java وتلقي القيم المرجعة منها. لاحظ كيف يتم التواصل عبر الـ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. 2 اقتباس
0 بلال زيادة نشر 15 فبراير 2021 أرسل تقرير نشر 15 فبراير 2021 يمكنك إنشاء مشروع مخصص للأندرويد باستخدام 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"; } } اقتباس
السؤال
احمد صوالحة
بما أن إطار العمل Flutter ينشئ تطبيقات native ويتعامل مع الـandroid والـIOS كل على حدة.
إذاً كيف يمكنني أن أنفذ كود بلغة java على الـandroid فقط ؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.