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

Flutter Dev

الأعضاء
  • المساهمات

    787
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    2

أجوبة بواسطة Flutter Dev

  1. بتاريخ On 2/10/2021 at 22:18 قال Sam Ahw:

    لا أعلم في حال كان الكود الذي قمت بكتابته هنا كاملاً لأنني لم ألاحظ مكان وجود رابط الاتصال مع paypal ولكن يجب عليك تغييره من api.sandbox إلى api.paypal وعادة يتم تقسيم الكود إلى 3 ملفات للسهولة، سأقوم بوضع مثال شامل لك لكي تستطيع الاستفادة منه بشكل كامل:
    أولاً ملف PaypalServices.dart وهو الملف المسؤول عن الاتصال مع paypal:
     

    
     

    الملف الثاني وهو PaypalPayment.dart المسؤول عن عرض webview التي ستقوم بدورها بعرض واجهة الدفع، وفي المثال التالي تم عرض شراء منتج موبايل على سبيل المثال كالتالي:

    
     

    وأخيراً، الملف الرئيسي الذي سيحوي زر عند الضغط عليه سيقوم بتحويلك إلى واجهة paypal السابقة، makePayment.dart:
     

    
     

    بالتوفيق،

    مرحبا اخي 

    شكرا على ردك والكود الذي ارسلته

    اخي هذا الكود يعمل نعم لقد قمت بتجربته من قبل ولكن توجد مشكله وحيده لا اعلم اذا كنت تعلم طريقة حلها

    المشكله هذا الكود يعرض للمستخدم طريقة الدفع القديمة من الباي يبال وليس النوع الجديد الذي يحتوي على خيار الدفع بواسطة الفيزا 

    هل تملك فكره عن سبب حدوث ذلك؟

     

  2. بتاريخ 6 دقائق مضت قال بلال زيادة:

    لو لاحظت في الكود المستخدم انه يوجد متغير باسم isEnvironmentSandbox وهذا يأخذ قيمة bool 

    يعني true or false 

    إذا أردت تغيير الوضع إلى live mode قم بتغيير قيمة isEnvironmentSandbox إلى false. 

     

    مرحبا اخي هو الان وضع false معمول من قبل

  3. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه للجميع

    لدي كود لدفع بواسطته الى بوابة الدفع PayPal

    الكود الان شغال على وضع الاختبار Sandbox 

    ارغب بتغيره الى الدفع الحقيقي كيف يمكن فعل ذلك؟

    الكود المستعمل كالتالي:

    
    import 'dart:async';
    import 'dart:convert';
    import 'package:flutter/material.dart';
    import 'package:flutter_paypal/models/paypal_response_model.dart';
    import 'package:meta/meta.dart';
    import 'package:flutter/services.dart';
    
    class FlutterPaypal {
      static const MethodChannel _channel =  const MethodChannel('flutter_paypal');
    
      static Future<String> initialization({
        @required bool isEnvironmentSandbox,
        @required String payPalClientId
      }) async {
        try {
          final String initResponse = await _channel.invokeMethod('initialization', {
            'isEnvironmentSandbox': isEnvironmentSandbox,
            'payPalClientId': payPalClientId,
          });
          return initResponse;
        } catch (e) {
          throw ErrorDescription(e.toString());
        }
      }
    
      static Future<PayPalResponse> processPayment({
        @required double amount,
        @required String currency,
        @required String description,
      }) async {
        try {
          final String paypalResponse = await _channel.invokeMethod('processPayment', {
            'amount': amount,
            'currency': currency,
            'description': description
          });
          return PayPalResponse.fromJson(jsonDecode(paypalResponse));
        } catch (e) {
          throw ErrorDescription(e.toString());
        }
      }
    
    }

     

     

    class PayPalResponse {
      Client client;
      Response response;
      String responseType;
      String paymentAmount;
    
      PayPalResponse(
          {this.client, this.response, this.responseType, this.paymentAmount});
    
      PayPalResponse.fromJson(Map<String, dynamic> json) {
        client =
            json['client'] != null ? new Client.fromJson(json['client']) : null;
        response = json['response'] != null
            ? new Response.fromJson(json['response'])
            : null;
        responseType = json['response_type'];
        paymentAmount = json['paymentAmount'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        if (this.client != null) {
          data['client'] = this.client.toJson();
        }
        if (this.response != null) {
          data['response'] = this.response.toJson();
        }
        data['response_type'] = this.responseType;
        data['paymentAmount'] = this.paymentAmount;
        return data;
      }
    }
    
    class Client {
      String environment;
      String paypalSdkVersion;
      String platform;
      String productName;
    
      Client(
          {this.environment,
          this.paypalSdkVersion,
          this.platform,
          this.productName});
    
      Client.fromJson(Map<String, dynamic> json) {
        environment = json['environment'];
        paypalSdkVersion = json['paypal_sdk_version'];
        platform = json['platform'];
        productName = json['product_name'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['environment'] = this.environment;
        data['paypal_sdk_version'] = this.paypalSdkVersion;
        data['platform'] = this.platform;
        data['product_name'] = this.productName;
        return data;
      }
    }
    
    class Response {
      String createTime;
      String id;
      String intent;
      String state;
    
      Response({this.createTime, this.id, this.intent, this.state});
    
      Response.fromJson(Map<String, dynamic> json) {
        createTime = json['create_time'];
        id = json['id'];
        intent = json['intent'];
        state = json['state'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['create_time'] = this.createTime;
        data['id'] = this.id;
        data['intent'] = this.intent;
        data['state'] = this.state;
        return data;
      }
    }

     

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:flutter_paypal/flutter_paypal.dart';
    import 'package:flutter_paypal/models/paypal_response_model.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
    
      TextEditingController _amountCtrl = TextEditingController();
      TextEditingController _descriptionCtrl = TextEditingController();
    
      PayPalResponse _payPalResponse;
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            appBar: AppBar(
              backgroundColor: Colors.black,
              elevation: 0.0,
            ),
            body: SingleChildScrollView(
              child: Container(
                margin: EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text('PayPal SDK example app', style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.bold)),
                        SizedBox(height: 5.0),
                        Text('Complete all the information below', style: TextStyle(color: Colors.grey)),
                        SizedBox(height: 10.0),
                        TextField(
                          controller: _amountCtrl,
                          keyboardType: TextInputType.phone,
                          decoration: InputDecoration(
                            hintText: "Amount to pay"
                          ),
                        ),
                        SizedBox(height: 10.0),
                        TextField(
                          controller: _descriptionCtrl,
                          decoration: InputDecoration(
                              hintText: "Description"
                          ),
                        ),
                        SizedBox(height: 40.0),
                        Container(
                          height: 45.0,
                          width: double.infinity,
                          child: RaisedButton(
                            color: Colors.white,
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(10.0)
                            ),
                            onPressed: () async {
                              try {
                                final result = await FlutterPaypal.initialization(
                                    isEnvironmentSandbox: false,
                                    payPalClientId: "=============================="
                                );
                                print(result);
                              } catch (e) {
                                print("Error initializing PAYPAL: ${e.toString()}");
                              }
                            },
                            child: Text("Initialze PayPal", style: TextStyle(fontWeight: FontWeight.bold),),
                          ),
                        ),
                        SizedBox(height: 20.0),
                        Container(
                          height: 45.0,
                          width: double.infinity,
                          child: RaisedButton(
                            color: Colors.black,
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(10.0)
                            ),
                            onPressed: () async {
                              try {
                                final result = await FlutterPaypal.processPayment(
                                    amount: double.parse(_amountCtrl.text),
                                    currency: "USD",
                                    description: _descriptionCtrl.text
                                );
                                setState(() {
                                  _payPalResponse = result;
                                });
                              } catch (e) {
                                print("Error in transaction with PAYPAL: ${e.toString()}");
                              }
                            },
                            child: Text("Pay with PayPal", style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),),
                          ),
                        ),
                        SizedBox(height: 40.0),
                        (_payPalResponse != null) ?
                        _buildPayPalResponse() :
                        Container()
                      ]
                    ),
                  ]
                ),
              ),
            ),
          ),
        );
      }
    
      _buildPayPalResponse() {
        return Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Text('RESPONSE', style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold),),
              SizedBox(height: 10.0),
              Text(_payPalResponse.paymentAmount),
              Text(_payPalResponse.response.state),
              Text(_payPalResponse.response.id),
              Text(_payPalResponse.response.intent),
              Text(_payPalResponse.response.createTime),
              Text(_payPalResponse.client.productName),
              Text(_payPalResponse.client.environment),
              Text(_payPalResponse.client.paypalSdkVersion),
              Text(_payPalResponse.client.platform),
            ],
          ),
        );
      }
    
    }

     

  4. بتاريخ الآن قال Sam Ahw:

    مرحباً مروان،
    الأسعار غالباً تكون موضحة على الموقع الالكتروني لبوابة الدفع، لذلك قم بالبحث على Google على موقع بوابة الدفع التي تقوم باستخدامها وهناك يمكنك قراءة العروض والأسعار وباقي التفاصيل.

    بالتوفيق،

    اهلا بك اخي 

    مع الاسف قمت بالعديد من المحاولات ولكن بدون فائده لا يوجد اسعار موضحة لهذا البوابة 

  5. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه لكم جميعا

    لدي استفسار لو تكرمتو

    احاول العمل على بوابة الدفع checkout وربطها مع تطبيقي

    ولكني لم استطيع ايجاد صفحة الاسعار الخاصة بهم هل لدى احدكم فكره عن الامر؟

  6. السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع 

    قمت بعمل حساب تطوير ابل 

    وعملت اضافة للبطاقة البنكية ل دفع البارحه ولكن اليوم عندما عدت انظر الى طلبي وجدته انه تم كنسلته مع اشعار كالتالي:

    Something went wrong.

    There was a problem with your request. Please try again.

    ومعمول عليه كنسل 

     

    قمت بدفع من جديد وتعبة بيانات البطاقة البنكية والان ظهر طلبي كالتالي

    Enrollment Complete

    من الخارج ولكن في الداخل 

    Something went wrong.

    There was a problem with your request. Please try again.

     

    والحساب ظاهر عليه panding 

    احد يعرف سبب هذا المشكلة او حل لها مع العلم ان البطاقة تحتوي على الرصيد المطلوب والبطاقة شغالهه لدفع يعني ادفع ابها بستمرار عبر الانترنت  او طريقة لتواصل لدى دعم ابل ممكن يردو علي فيهم؟

  7. مرحبا جميعا

    شكرا لكم على مساعدتكم

    تم حل المشكله بنجاح

    حذفت حسابي وعملت حساب اي كلاود جديد من الجوال واضافة وسيلة الدفع من الجوال

    ثم قمت بربطه مع الماك وتفعيل المصادقه الثانويه

    بالاضافة الى اني كنت متصل بشبكة خلوية وليست واي فاي

    ايضا قمت بعمل رقم هاتف مختلف مثل ما تم الاشاره من قبلكم سابقا

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

     

    طبعا ياخذو يومين عمل حتى تاتي الموافقة

    مع العلم اني مسجل من الماك من متصفح سفاري بدون حذف بيانات سابقه من المتصفح 

  8. بتاريخ منذ ساعة مضت قال فوحال محمد تقي الدين:

    السلام عليكم ,

    لا أستطيع معرفة السبب الحقيقي لكن جرب الدخول بشبكة 4 جي مثلا بدل الوايفاي , وان كنت متصل على vpn عطله

    ممكن تكون أيضا مشاكل بحسابك البنكي

    الواي فاي معي شغال على كل شي مافيه شي مغلق يعني

    بنسبة ل بروكسي انا لست اعمل على بروكسي

    الحساب البنكي شغال /100/100 انا ادفع ابه في خمسات وفي علي اكسبرس 

  9. السلام عليكم ورحمة الله وبركاته

    احاول افتح حساب مطورين من خلال موقع ابل وقمت تقريبا بكل الخطوات المطلوبه ولكن في كل مره تواجهني المشكلة التالية

    Your enrollment could not be completed.

    Your enrollment in the Apple Developer Program could not be completed at this time.

     

    مع العلم اني مفعل المصادقه الثانوية ومدخل حساب بنكي وفيه رصيد المطلوب 99 دولار واكثر ايضا

    وحساب APPLE ID  عامله

    ولكن كل ذلك لم ينفع لا زلة اواجه نفس المشكلة 

    حاولت التسجيل من جهاز ماك وايضا ويندوز والمشكله مستمره

    هل يعلم احدكم حل لهذا المشكله او ما هو سببها ؟

     

  10. بتاريخ 3 دقائق مضت قال Yomna Raouf:

    هل يمكنك تحديث نسخة xcode إلى 12.2beta

    ثم تنزيل هذه الملفات و وضعها في هذا المسار:

    
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

    و إخباري بالنتائج؟

    كنت ارغب بتحديث نسخة اكس كود ولكن في المتجر يخبرني انها تعمل على اصدار 10.15.4 

    وانا لدي نسخة Catalina  10.15.3

  11. بتاريخ 53 دقائق مضت قال Wael Aljamal:

    مرحبا مروان،

    هل قمت بتجريب التطبيق على المحاكي simulator الخاص بجهازك mac؟ في حاول وجود خطأ في برمجة التطبيق ستعترضك نفس المشكلة في المحاكي و في الجهاز الحقيقي.

    لحل مشكلة عمل التطبيق على الهاتف يوجد نقص في ملفات دعم تشغيل التطبيق على الهاتف DeviceSupport يجب إضافتها للمسار التالي في مشروعك:

    
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
    

    عليك القيام بتحميل النسخة الموافقة لنظام التشغيل على الهاتف من القائمة التالية:

    رابط تحميل ملفات دعم تشغيل تطبيقات ios على الهاتف أو من هنا رابط آخر (يوجد معلومات عن إصدار Xcode و نظام تشغيل ios أرجو تحميل النسخة المتوافقة)

    أيضا عليك تنفيذ الخطوات التالية:

    1. فصل الوصلة بين الهاتف و الحاسوب
    2. مسح بيانات المشروع clean project
    3. إلغاء تثبيت التطبيق عن الهاتف
    4. إعادة تشغيل كلاَ من الهاتف ومحرر النصوص Xcode
    5. تأكد من تحديث ios image و برنامج Xcode قبل إعادة المحاولة 

    بالتوفيق

    مع الاسف اخوي اني سبق وقمت بتجربة كل ذلك ولم ينجح الامر 

    اما بنسبة لوضع المحاكي التطبيق شغال على المحاكي 110/100

    بتاريخ 50 دقائق مضت قال Yomna Raouf:

    النسخ التي تستخدمها متوافقة.

    هل يمكنك تجربة الخطوات التالية:

    • فصل الاقتران بين ءcode و الهاتف Unpair the device in Xcode.
    • تنظيف ملفات المشروع Clean the project.
    • فصل الهاتف من جهاز الحاسوب Unplug and then restart iPhone.
    • إعادة تشغيل xcode  Restart Xcode.
    • و التجربة مرة أخرى

    من المفترض أن يعمل بعدها بشكل صحيح

    مع الاسف انني سبق وقمت بعمل كل ذلك ولم ينجح الامر

  12. السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع 

    لدي استفسار لو تكرمتو..

    احاول تنصيب تطبيق IOS من xcode على جهازي الحقيقي التنصيب يتم والتطبيق يتم تثبيته بنجاح على جهازي ولكن تظهر الرسالة التاليه لدي :

    ios.png.2e4fa3b7d2fd99fef2d7aae099f8c757.png

     

    اما التطبيق في الهاتف الذي تم تنصيبه كل ما اضغط على الايقونه حتى يعمل يتم اغلاقه بدون ان يعمل فقط تظهر شاشة بيضا لون مدة ثانية وينغلق 

    نوع التطبيق الذي احاول تشغيله flutter app

     

    Catalina  10.15.3

    IOS 14.2

    XCODE 11.7

    هل يعلم احدكم سبب حدوث ذلك؟ مع العلم اني اعطيك التطبيق صلاحيات المطور من الهاتف الحقيقي

  13. بتاريخ 7 ساعات قال كريم أمعطيل:

    بداية تأكد من إعتمادك اخر إصدار من Flutter ثم بعد هذا الكود الذي طرحته لا يمكن إعتماده مباشرة في المشروع, لكن سأقوم بكتابة الكود لك حتى تتمكن من إعتماده بشكل مباشر ووضعه في ملف main.dart

    
    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'dart:isolate';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Flutter Isolate Demo',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new MyHomePage(title: 'Flutter Isolates'),
        );
      }
    }
    
    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> {
      Isolate _isolate;
      bool _running = false;
      static int _counter = 0;
      String notification = "";
      ReceivePort _receivePort;
     
      void _start() async {
        _running = true;
        _receivePort = ReceivePort();
        _isolate = await Isolate.spawn(_checkTimer, _receivePort.sendPort);
        _receivePort.listen(_handleMessage, onDone:() {
            stdout.writeln('جاري إعادة بدأ العازل');
        });
      }
    
      static void _checkTimer(SendPort sendPort) async {
        Timer.periodic(new Duration(seconds: 1), (Timer t) {
          _counter++;
          String msg = 'إشعار ' + counter.toString();  
          stdout.write('أرسل: ' + msg + ' - ');  
          sendPort.send(msg);
        });
      }
    
      void _handleMessage(dynamic data) {
        stdout.write('إستقبل: ' + data + ', ');
        setState(() {      
          notification = data;
        });
      }
    
      void _stop() {
        if (_isolate != null) {
          setState(() {
              _running = false; 
              notification = '';   
          });
          _receivePort.close();
          _isolate.kill(priority: Isolate.immediate);
          _isolate = null;        
          }
      }
    
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text(widget.title),
          ),
          body: new Center(
            child: new Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                new Text(
                  notification,
                ),
              ],
            ),
          ),
          floatingActionButton: new FloatingActionButton(
            onPressed: _running ? _stop : _start,
            tooltip: _running ? 'إيقاف العداد' : 'بدأ العداد',
            child: _running ? new Icon(Icons.stop) : new Icon(Icons.play_arrow),
          ),
          );
      }
    }

    وتأكد من ان ملف dart.exe موجود في المسار, وفي النهاية نفذ ببساطة الأمر (Command) التالي "dart main.dart" ليعمل التطبيق

    يجب أن تحصل على نتيجة في الـconsole مثل :

    
    جاري إعادة بدأ العازل
    أرسل: إشعار 1 - إستقبل: إشعار 1,أرسل: إشعار 2 - إستقبل: إشعار 2,أرسل: إشعار 3 - إستقبل: إشعار 3,

     

    اشكرك الغالي 

  14. بتاريخ 59 دقائق مضت قال كريم أمعطيل:

    محتوى الـLog (سجل الاخطاء) طويل ويُظهر عدة مسارات

    ستساعدني كثيراً في حل المشكل لو تذكر لي محتوى الاسطر بالظبط التي تظهر فيها الاخطاء وهل احد هذه الاسطر هو الكود الذي اقترحته عليك

    اهلا اخي

    انا عملت مشروع جديد وعلمت كوبي بست للكود الذي ارسلته لي وظهر لي هذا الخطاء فقط

  15. بتاريخ 15 ساعات قال كريم أمعطيل:

    مرحباً,

    بدايةً يجب توضيح أن اللغة التي بُرمج بها Flutter تُسمى Dart وهي لغة من بين عدة لغات مُعدة بنظام العرض-المترابط او المتزامن وهو نظام يُركز على تنفيذ الأوامر سطراً بسطر وحفظها سطر بسطر, كما هو الحال بالنسبة للزر الذي يحسب عدد مرات الضغط عليه

    وهذا رابط لمقال مُفيد جداً يشرح الموضع بتعمق : Dart والبرمجة المتزامنة

    لكن ما علاقة هذا بسؤالك؟

    العلاقة هي أنه بفهم الطريقة التي بُرمج بها Flutter نستطيع إيجاد حل للمشكل 

    الحل هو إعتماد خاصية العزل (Isolate) في تنفيذ الأمر الذي تريده (وفي حالتك إبقاء العداد شغال في الخلفية) , هذه الخاصية عند إضافتها في Dart ستسمح بتنفيذ أوامر في الخلفية بشكل منعزل عن باقي الأوامر التي يحتاجها التطبيق أثناء التصفح ويمكن تشغيل هذه الأوامر بصفة دورية (مثلاً كل 1000 جزء من الثانية).

    والتالي هو مثال لكود العزل الذي نتحدث عنه, تستطيع نسخه وإعتماد نفس المبدأ في تنفيذ فكرة الـTimer

    
    import 'dart:io';
    import 'dart:async';
    import 'dart:isolate';
    
    Isolate isolate;
    
    void start() async {
      ReceivePort receivePort= ReceivePort(); // مدخل العازل لإسقبال الرسائل
      isolate = await Isolate.spawn(runTimer, receivePort.sendPort);
      receivePort.listen((data) {
        stdout.write('إستقبل: ' + data + ', ');
      });
    }
    
    void runTimer(SendPort sendPort) {
      int counter = 0;
      Timer.periodic(new Duration(seconds: 1), (Timer t) {
        counter++;
        String msg = 'إشعار ' + counter.toString();  
        stdout.write('أرسل: ' + msg + ' - ');  
        sendPort.send(msg);
      });
    }
    
    void stop() {  
      if (isolate != null) {
          stdout.writeln('حذف العازل');
          isolate.kill(priority: Isolate.immediate);
          isolate = null;        
      }  
    }
    
    void main() async {
      stdout.writeln('جاري إعادة بدأ العازل');
      await start();
      stdout.writeln('إضغط أي رمز للخروج...');
      await stdin.first;
      stop();
      stdout.writeln('وداعاً');
      exit(0);
    }

    بالتوفيق

    حاولت اشغل الكود الذي ارسلته اخي وتظهر لدي المشكله التاليه:

     

    E/flutter (29512): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Bad state: No element
    E/flutter (29512): #0      Stream.first.<anonymous closure> (dart:async/stream.dart:1294:9)
    E/flutter (29512): #1      _rootRun (dart:async/zone.dart:1182:47)
    E/flutter (29512): #2      _CustomZone.run (dart:async/zone.dart:1093:19)
    E/flutter (29512): #3      _CustomZone.runGuarded (dart:async/zone.dart:997:7)
    E/flutter (29512): #4      _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:410:13)
    E/flutter (29512): #5      _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:420:15)
    E/flutter (29512): #6      _BufferingStreamSubscription._close (dart:async/stream_impl.dart:305:7)
    E/flutter (29512): #7      _SyncStreamControllerDispatch._sendDone (dart:async/stream_controller.dart:816:19)
    E/flutter (29512): #8      _StreamController._closeUnchecked (dart:async/stream_controller.dart:671:7)
    E/flutter (29512): #9      _StreamController.close (dart:async/stream_controller.dart:664:5)
    E/flutter (29512): #10     _Socket._onData (dart:io-patch/socket_patch.dart:2027:21)
    E/flutter (29512): #11     _rootRunUnary (dart:async/zone.dart:1206:13)
    E/flutter (29512): #12     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
    E/flutter (29512): #13     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
    E/flutter (29512): #14     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
    E/flutter (29512): #15     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
    E/flutter (29512): #16     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:808:19)
    E/flutter (29512): #17     _StreamController._add (dart:async/stream_controller.dart:682:7)
    E/flutter (29512): #18     _StreamController.add (dart:async/stream_controller.dart:624:5)
    E/flutter (29512): #19     new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1563:35)
    E/flutter (29512): #20     _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1045:18)
    E/flutter (29512): #21     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
    E/flutter (29512): #22     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
    E/flutter (29512): 

    هل تعلم ما هيا المشكلة؟

  16. بتاريخ 1 ساعة قال كريم أمعطيل:

    مبدئياً نعم, يجب ان يعما العداد حتى بعد إغلاق التطبيق

    لكن في حال لم ينجح الأمر معك تستطيع إعتماد مصفوفة Android_Alarm_Manager لكن هذه فقط لأجهزة الأندرويد

    مُرادفها في الـIOS هو UIBackgroundModes مع إعتماد setKeepAliveTimeout:handler: لإعادة تشغيل الأمر فور إغلاق التطبيق (من طرف النظام)

     

    وكإضافة وبعيداً عن موضوع العداد, إذا كنت ستحتاج مثلاً إحداثيات المستخدم في كل مرة ولديك كود يقوم بالعملية في الخلفية فستحتاج طلب موافقة (الصلاحية) من المستخدم وبالتالي النظام لن يقوم بإيقاف أوامر التطبيق حتى بعد غلقه, أنصحك بقرائة التعليمات الخاصة ببرمجة تطبيقات الهواتف التي تعمل إما Android او IOS

    شكرا لك اخي كفيت وفيت ربي يزيدك من واسع فضله

  17. بتاريخ 2 ساعات قال كريم أمعطيل:

    مرحباً,

    بدايةً يجب توضيح أن اللغة التي بُرمج بها Flutter تُسمى Dart وهي لغة من بين عدة لغات مُعدة بنظام العرض-المترابط او المتزامن وهو نظام يُركز على تنفيذ الأوامر سطراً بسطر وحفظها سطر بسطر, كما هو الحال بالنسبة للزر الذي يحسب عدد مرات الضغط عليه

    وهذا رابط لمقال مُفيد جداً يشرح الموضع بتعمق : Dart والبرمجة المتزامنة

    لكن ما علاقة هذا بسؤالك؟

    العلاقة هي أنه بفهم الطريقة التي بُرمج بها Flutter نستطيع إيجاد حل للمشكل 

    الحل هو إعتماد خاصية العزل (Isolate) في تنفيذ الأمر الذي تريده (وفي حالتك إبقاء العداد شغال في الخلفية) , هذه الخاصية عند إضافتها في Dart ستسمح بتنفيذ أوامر في الخلفية بشكل منعزل عن باقي الأوامر التي يحتاجها التطبيق أثناء التصفح ويمكن تشغيل هذه الأوامر بصفة دورية (مثلاً كل 1000 جزء من الثانية).

    والتالي هو مثال لكود العزل الذي نتحدث عنه, تستطيع نسخه وإعتماد نفس المبدأ في تنفيذ فكرة الـTimer

    
    import 'dart:io';
    import 'dart:async';
    import 'dart:isolate';
    
    Isolate isolate;
    
    void start() async {
      ReceivePort receivePort= ReceivePort(); // مدخل العازل لإسقبال الرسائل
      isolate = await Isolate.spawn(runTimer, receivePort.sendPort);
      receivePort.listen((data) {
        stdout.write('إستقبل: ' + data + ', ');
      });
    }
    
    void runTimer(SendPort sendPort) {
      int counter = 0;
      Timer.periodic(new Duration(seconds: 1), (Timer t) {
        counter++;
        String msg = 'إشعار ' + counter.toString();  
        stdout.write('أرسل: ' + msg + ' - ');  
        sendPort.send(msg);
      });
    }
    
    void stop() {  
      if (isolate != null) {
          stdout.writeln('حذف العازل');
          isolate.kill(priority: Isolate.immediate);
          isolate = null;        
      }  
    }
    
    void main() async {
      stdout.writeln('جاري إعادة بدأ العازل');
      await start();
      stdout.writeln('إضغط أي رمز للخروج...');
      await stdin.first;
      stop();
      stdout.writeln('وداعاً');
      exit(0);
    }

    بالتوفيق

    هلا بك الغالي 

    شكرا على ردك ي غالي

    وتوضيح الفكره

    لدي استفسار بس لو تكرمت /هل هذا الطريقة تجعل العدد لا يتوقف حتى لو قام المستخدم باغلاق التطبيق؟

  18. بتاريخ 9 ساعات قال Wael Aljamal:

    مرحبا مروان،

    لدي اقتراح ربما تستطيع برمجته بسهولة نسبية.

    ما رأيك بأن ترسل طلب معين من برمجتك PHP (متزامنا مع إضافة بيانات جديدة لقاعدة البيانات MYSQL) مثلا، لقاعدة بيانات Firebase و في القسم المسؤول عن استلام الطلبية تكتب شيفرة برمجية مهمتها ارسال الاشعار للمستخدم المطلوب.

    حيث تقوم بطلب رابط firebase معين مع ارسال بيانات مناسبة مثلا رقم المستخدم المطلوب أن يصله إشعار و من ثم تنفيذ باقي التفاصيل كما ذكرت.

    بالتوفيق

    اهلا بك ي غالي

    اشكرك على ردك والله

    ولكن بيني وبينك لم استوعب الفكره والله 

    لا اعلم لماذا يبدو لي امر معقد ولم استطع استيعابه

    الا يوجد شرح للامر اخوي مثلا مقطع او مقال مكتوب

     

    المشكله قمت بالبحث طويل ولم اجد احد قام بشرح هذا النقطه ابد الامر غريب جدا

  19. السلام عليكم ورحمة الله وبركاته

    قمت بالبحث طويل بخصوص ربط Firebase Cloud Messaging في الفلاتر مع mysql and php  ولكني لم اجد اي شرح لتنفيذ ذلك

    احتاج ان افهم طريقة عمل ذلك بالخطوات حقيقا اول مره اجرب عمل هذا الامر لم ييسبق لي التعامل معها حتى في الجافا ولم استطع استيعاب طريقة عمل ذلك

    انا امتلك جدول تعليقات في قاعدة بيانات mysql 

    واحتاج عمل كل ما وصل تعليق جديد ارسل تنبيه او اشعار للمستخدم المستهدف بوجود تعليق مع الموضوع المرسول له

    لم استطع فهم طريقة ربط Firebase Cloud Messaging مع mysql وكيف سيتم اشعار Firebase بوجود تعليق في mysql 

    انا الان قمت بعمل ربط Firebase مع مشروعي واستطيع ارسال الاشعارات من موقع Firebase ايضا قمت بعمل كود بسيط من خلاله استطيع الحصول على token الجهاز

    ما هيا الخطوه التاليه الان او ماذا يجب علي ان افعل لاحقا لستكمال العمل ؟

    ياليت الي معه فكره يشرح لنا لو تكرمتو الخطوات حتى نستوعب الامر

    ولكم جزيل الشكر

     

  20. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه للجميع.

    استفسار لو تكرمتو.

    احاول استخدام timer ليعمل تشغيل دالة بشكل مستمر بعد وقت محدد الامر ناجح ولكن توجد مشكلة لو خرجنا من التطبيق ايضا التايمر شغال ولكن لو قام المستخدم باغلاق التطبيق كامل التايمر هنا يتوقف 

    هل توجد طريقة تمنعه من التوقف تعمل على  المنصتين ؟ اندرويد / IOS?  في حالة اغلاق التطبيق كامل

  21. بتاريخ 28 دقائق مضت قال Yomna Raouf:

    يمكنك استخدام الطريقة التالية باستخدام مكتبة dart:io لتحديد نظام التشغيل الخاص بالجهاز.

    حيث يمكنك الحصول غلى اسم نظام التشغيل كسلسلة نصية string باستخدام الoperatingSystem getter، و يمكنك أيضًا استخدام أحد ال boolean getters مثل isMacOS, isLinux, and isWindows

    
    import 'dart:io' show Platform;
    
    void main() {
    
    // Get the operating system as a string.
      String os = Platform.operatingSystem;
    
    // Or, use a predicate getter.
    if (Platform.isIOS) {
      print('is a IOS');
    } else if (Platform.isAndroid) {
      print('is a Andriod');
    } else {
    }

     

    زادك الله من واسعه فضله 

  22. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه للجميع

    كيف يمكن معرفة او تحديد نظام تشغيل الهاتف الذي يعمل عليه تطبيق فلاتر 

    اذا كان اندرويد او ايفون ؟ في :

     

     @override
      void initState() {
        super.initState();
    
    
    
      }

    احاول ان اضع دالة شرطية بعد اكتشاف نظام تشغيل الهاتف IF  في initState()

  23. السلام عليكم ورحمة الله وبركاته 

    تحيه طيبه للجميع .

    قمت بتطبيق عمل الاضافة workmanager flutter  لجعل التطبيق يعمل في الخلفية التطبيق شغال على المنصتين اندرويد وايفون ولكن توجد مشكلة

    على الاندرويد يجب اضافة السطر البرمجي التالي حتى يعمل كل 15 دقيقة في خلفية التطبيق:

      @override
      void initState() {
        super.initState();
    
    
      Workmanager.registerPeriodicTask(
         "1",
         fetchBackground,
          frequency: Duration(minutes: 15),
     );
    
    
    
      }

     

    بالمقابل لو اخذنا التطبيق على منصة ios رح يظهر لنا انه تكون مشكله بحسب كلام موقع فلاتر ف منصة ios  لا تدعم عمل خاصية registerPeriodicTask ولو حذفت هذا السطر ورجعنا لنظام اندرويد ما رح يعمل على الاندرويد 

    كيف ممكن نحل هذا المشكلة ؟ بحيث انه ما يتعرض في المنصتين 

     

    اما المشكلة الثانية لو حذفنا registerPeriodicTask عشان نجعل workmanager لزم نذهب الى xcode ثم من قائمة Debug → Simulate Background Fetch حتى يعمل هذا مشكلة كيف نجعله يعمل بشكل مستمر بدون هذا الامر ؟ ايضا مع هذا الطريقة يعمل لمرة واحدة فقط ولا يعود يعمل بعدها ما لم اعمل نفس الخطوه من جديد Debug → Simulate Background Fetch

    الكود المستخدم لدي كامل:

    import 'dart:io';
    
    import 'package:flutter/material.dart';
    import 'package:geolocator/geolocator.dart';
    import 'package:workmanager/workmanager.dart';
    import 'package:background_location/notification.dart' as notif;
    
    const fetchBackground = "fetchBackground";
    /*
    void callbackDispatcher() {
      Workmanager.executeTask((task, inputData) async {
        switch (task) {
          case fetchBackground:
            //Geolocator geoLocator = Geolocator()..forceAndroidLocationManager = true;
            Position userLocation = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
            notif.Notification notification = new notif.Notification();
            notification.showNotificationWithoutSound(userLocation);
            break;
        }
        return Future.value(true);
      });
    }
    
    
     */
    void callbackDispatcher() {
      Workmanager.executeTask((task, inputData) async{
        switch (task) {
          case Workmanager.iOSBackgroundTask:
            stderr.writeln("The iOS background fetch was triggered");
            Position userLocation = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
            notif.Notification notification = new notif.Notification();
            notification.showNotificationWithoutSound(userLocation);
            break;
    
        }
        bool success = true;
        return Future.value(success);
      });
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
    
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
    
      @override
      void initState() {
        super.initState();
    
        // We don't need it anymore since it will be executed in background
        //this._getUserPosition();
    
        Workmanager.initialize(
          callbackDispatcher,
          isInDebugMode: true,
        );
    
      //  Workmanager.iOSBackgroundTask;
    
       // Workmanager.registerPeriodicTask(
        //    //   "1",
        //     //  fetchBackground,
        //    //   frequency: Duration(minutes: 30),
        //     //);
    
     //   callbackDispatcher();
    
    
      }
    
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  "",
                  style: Theme.of(context).textTheme.display1,
                ),
              ],
            ),
          ),
        );
      }
    }

    باقي الخطوات انا متبع شرح تنصيب الاضافة على  ios 

    https://github.com/fluttercommunity/flutter_workmanager/blob/master/IOS_SETUP.md

    ياليت الي معه فكره ب هذا المشاكل يفيدنا ولكم جزيل الشكر  

     

  24. بتاريخ الآن قال Wael Aljamal:

    نعم هي مصممة لهذا الغرض ويوجد مثال في شرح المكتبة لهذا الغرض يمكنك دراسته ومن ثم التعديل و كتابة الدوال الخاصة بك

    حسب توصيف المكتبة :

    
    Flutter WorkManager is a wrapper around Android's WorkManager and iOS' performFetchWithCompletionHandler, effectively enabling headless execution of Dart code in the background.
    
    This is especially useful to run periodic tasks, such as fetching remote data on a regular basis.

    هي تقوم بمحاكاة عمليات الخلفية لجلب البيانات في كلا نظامي أندرويد و ios و تساعد في تنفيذ شيفرة مكتوبة بلغة DART في الخلفية، تعمل بشكل خاص للمهام المجدولة كجلب بيانات من المخدم

    ممتاز جد ربي يعطيك الف صحه وعافيه عزيزي على التوضيح

    • أعجبني 1
×
×
  • أضف...