-
المساهمات
4657 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
30
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو بلال زيادة
-
سوف تستخدم 4 حزم في flutter وهي firebase_core firebase_auth cloud_firestore firebase_messaging في مسار android\app\src\main في ملف AndroidManifest.xml سوف تضيف التالي <action android:name="FLUTTER_NOTIICATION_CLICK" /> بعد تهيئة الحزم داخل التطبيق. تقوم باستخدام أي لغة backend لأرسال الإشعارات و هناك مكتبة كاملة في php اسمها firebase-php من هنا ويمكنك باستخدام هذه المكتبة من إرسال إشعارات فردية لجهاز واحد أو لعدة أجهزة عن طريق topics.
- 3 اجابة
-
- 2
-
-
هل ممكن ترفق ملفات مشروعك بشكل مضغوط؟
-
يجب الإطلاع على الحزمة من pub.dev حتى تستطيع التمييز أي نسخة تختار.
-
يتم استخدامها بهذا الشكل FaIcon(FontAwesomeIcons.x)
- 9 اجابة
-
- 1
-
-
ممكن صورة للمشكلة , أو ممكن يكون هناك مشكلة في طريقة استخدام المكتبة.
- 9 اجابة
-
- 1
-
-
إذا كان ما تريد موجود في مكتبة fontawsome يمكنك تثبيت الحزمة في مشروع بوضع المكتبة في ملف pubspec.ymal font_awesome_flutter: ومن ثم تنفيذ الأمر التالي flutter pub get إذا لم تجد ما تريد يمكنك صنع الأيقونات بصيغة svg أو جعل مصمم يقوم بتنفيذ الأيقونات لك.
- 9 اجابة
-
- 1
-
-
هل يمكنك تنفيذ الأمر التالي flutter doctor و من ثم مشاركة النتائج معي.
- 4 اجابة
-
- 1
-
-
قم بتحديث نسخة android studio لديك يبدو أنها هي التي تسبب الخطأ. ومن ثم أخباري بالنتيجة.
- 4 اجابة
-
- 1
-
-
الأمر بسيط جداً , يمكنك تغيير القيمة التالية itemCount: GetData.length, إلى أي رقم تريده وليكن مثلاً 6 بهذا الشكل itemCount: 6, بحيث سيظهر فقط 6 منتجات فقط.
- 2 اجابة
-
- 1
-
-
تمام, يجب وضع الحل حتى تعم الفائدة, وبخصوص الخاصية alignLabelWithHint: true, سوف تنجح ايضا يمكنك تجربة إحاطة TextFormField بخاصية Directionality بحيث تحدد مكان النص.
- 5 اجابة
-
- 1
-
-
هل تقصد بأنه تريد تغيير مكان النص في textFormField ؟
- 5 اجابة
-
- 1
-
-
يرجى إرفاق الكود الخاص بك ليتم النظر فيه, يرجى إرفاق الملف الخاص بالواجهة. أو يمكنك إحاطة Widget Text ب Widget أخر و هو Widget Algin بحيث تزود هذه Widget خاصية alignment التي بدورها تحدد مكان النص. Align( alignment: Alignment.topRight, child: Text("name"), )
- 5 اجابة
-
- 1
-
-
بخصوص أين يتم ذلك يتم ذلك داخلياً في اللغة , سأعطيك مثال توضيحي الأن في مثلاً لغة PHP قمنا بالاستعلام داخل جدول في قاعدة بيانات وقمنا بجلب محتوياته , هل نشاهد ذلك أم يحدث الأمر داخلياً في اللغة عن طريق الدوال التي استخدمناها في عملية الاستعلام وهكذا الأمر في Symbol.toPrimitive التي تستخدم لتحويل الكائن إلى قيمة أولية . بمساعدة الخاصية Symbol.toPrimitive (التي تشير إلى دالة) , يمكننا تحويل الكائنات إلى القيم الأولية الموافقة لها , وهذه الدالة تستدعى مع الوسيط النصي hint , والذي يحدد ما هو النوع المفضل للقيمة الأولية المعادة , ويمكن أن تكون قيمة هذا الوسيط number أو string أو default. ربما زيارة توثيق حسوب من هنا أو من هنا يفيدك كثيرا.
- 3 اجابة
-
- 1
-
-
يوجد في جافاسكريبت دالة Symbol و هي دالة تعيد قيمة من النوع symbol , وتمتلك هذه الدالة خاصيات ساكنة و دوال ساكنة. كل رمز معاد من الدالة Symbol هو رمز فريد, ويمكن أن يستخدم كمعرف لخاصيات الكائنات. يتم استخدامه حصراً حتى لو أنتا حابب تضع بيانات private بداخل Object تستخدمها على مستوى Application الخاص بك بس لا يتم عرضها في أي عملية تكرار ( أي لا يتم عرض Symbol ) ففي المثال التالي لاحظ أنه لدينا عملية تكرار const myNewSymbol = Symbol(); let myObject = { username: "test", title: "hello", [myNewSymbol]: "Hello, How are You" } for(let val of Object.entries(myObject)){ console.log(val); } فأن عملية التكرار لا تعرض symbol كما في الصورة المرفقة. أتمنى أن أكون قد فهمت سؤالك جيداً وأجبت عنه بصورة جيدة.
- 3 اجابة
-
- 1
-
-
يمكنك أستخدام Widget RadioListTile بحيث تضع أكثر من خيار و عندما يقوم المستخدم بأختيار أي خيار موجود تأخذ قيمته, ستقوم بتعريف enum تحتوي الخيارات الثلاثة enum RadioValues { _, yes, no} ثم تقوم بتعريف متغير وليكن اسمه _values RadioValues _values = RadioValues.yes; وتقوم بإعطاءه قيمة افتراضية, ثم تنشأ Column لأحتواء الخيارات الثلاثة مثل Column( children: [ RadioListTile<RadioValues>( title: Text("_"), value: RadioValues._, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), RadioListTile<RadioValues>( title: Text("Yes"), value: RadioValues.yes, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), RadioListTile<RadioValues>( title: Text("No"), value: RadioValues.no, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), ], ); و في دالة onChanged تقوم بتعريف setState ليقوم عند التغيير إلى خيار يحفظ قيمة الخيار الجديد وتخزينها في متغير values_. كامل الكود import 'package:flutter/material.dart'; enum RadioValues { _, yes, no} class RadioTest extends StatefulWidget { @override _RadioTestState createState() => _RadioTestState(); } class _RadioTestState extends State<RadioTest> { RadioValues _values = RadioValues.yes; @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Column( children: [ RadioListTile<RadioValues>( title: Text("_"), value: RadioValues._, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), RadioListTile<RadioValues>( title: Text("Yes"), value: RadioValues.yes, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), RadioListTile<RadioValues>( title: Text("No"), value: RadioValues.no, groupValue: _values, onChanged: (RadioValues value){ setState(() { _values = value; }); }), ], ), ), ); } }
- 1 جواب
-
- 1
-
-
تأكد من ترميز الملف أنه UTF-8, ايضا تأكد أنه لا يوجد سطر فارغ قبل وسم بداية PHP.
- 9 اجابة
-
- 1
-
-
يعني نجح الأمر ولا لا
- 9 اجابة
-
- 1
-
-
صحيح يفوم بفتح الصفحة و عند وضع اسم المستخدم الذي تريد البحث عنه وتضغط ارسال تحول الى صفحة بحث تويتر.
- 9 اجابة
-
- 1
-
-
يمكنك إنشاء فورم بحث ويكون method الخاص بعملية الإرسال POST إي عندما تدخل الاسم في حقل البحث و تضغط على زر بحث يقوم بالبحث وجلب النتائج المطلوبة. <?php if(isset($_POST['submit'])) { $username = $_POST['username']; header("Location: https://twitter.com/search?q=$username") ; } ?> <!DOCTYPE html> <html> <head></head> <body> <form action="a.php" method="POST"> <input type="text" name="username" /> <br /> <input type="submit" name="submit" /> </form> </body> </html>
- 9 اجابة
-
- 1
-
-
يجب أن تقوم بوضع BuildContext context في Widget logout بهذا الشكل Widget logout(BuildContext context) { } أو يمكنك وضع في أعلى الصفحة في مكان ما تقوم به بتعريف أي متغير بوضع التالي BuildContext context; يمكنك تجربة الطريقة الأولى فهي أفضل.
-
يمكنك استخدام مكتبة SQLite2XL من هنا , تستخدم المكتبة لتصدير قاعدة بيانات SQLite مثل ملف Excel إلى الموقع الافتراضي أو الموقع المحدد من قبل المستخدم. تسمح لنا هذه المكتبة بتصدير جدول واحد أو قائمة جداول أو قاعدة البيانات بأكملها كـ Excel. حيث يجب إعطاء تصريح <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> لتهيئة المكتبة يجب استخدام SqliteToExcel sqliteToExcel = new SqliteToExcel(this, "mydb.db"); إذا كنت تريد تصدير الملف إلى مسار مفضل يمكنك استخدام SqliteToExcel sqliteToExcel = new SqliteToExcel(this, "mydb.db", directory_path); لتصدير جدول واحد نستخدم sqliteToExcel.exportSingleTable("table1", "singleTable.xls", new SQLiteToExcel.ExportListener() { @Override public void onStart() { } @Override public void onCompleted(String filePath) { } @Override public void onError(Exception e) { } }); لتصدير مجموعة من الجداول sqliteToExcel.exportSingleTable(listTable, "listTable.xls", new SQLiteToExcel.ExportListener() { @Override public void onStart() { } @Override public void onCompleted(String filePath) { } @Override public void onError(Exception e) { } }); لتصدير قاعدة البيانات بإكملها sqliteToExcel.exportAllTables ("allTable.xls", new SQLiteToExcel.ExportListener() { @Override public void onStart() { } @Override public void onCompleted(String filePath) { } @Override public void onError(Exception e) { } }); يمكنك تعريف زر بهذا الشكل Button btnSqliteExport; btnSqliteExport = (Button) findViewById(R.id.btn_sqlite_export); ثم لتعريف حدث التصدير على الزر btnSqliteExport.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View view) { String directory_path = Environment.getExternalStorageDirectory().getPath() + "/Backup/"; File file = new File(directory_path); if (!file.exists()) { file.mkdirs(); } // لتصدير قاعدة البيانات لملف إكسل SQLiteToExcel sqliteToExcel = new SQLiteToExcel(getApplicationContext(), DBHelper.DB_NAME, directory_path); sqliteToExcel.exportAllTables("allTables.xls", new SQLiteToExcel.ExportListener() { @Override public void onStart() { } @Override public void onCompleted(String filePath) { Utils.showSnackBar(view, "تم التصدير بنجاح"); } @Override public void onError(Exception e) { } }); } }); }
-
توجد شركة agara يمكنك قراءة التوثيق الخاص بها من هنا , تقريباً هي أفضل شركة تقدم خدمات live Streaming. بعد الاشتراك في هذه الخدمة يمكنك تضمين مكتبة agora_rtc_engine داخل مشروعك يمكنك إيجاد المكتبة من هنا. في ملف pubspec.yaml تضع التالي agora_rtc_engine: ^3.3.3 ثم تقوم بتنفيذ الأمر التالي flutter pub get بعد الاشتراك ستجد APPI_ID, TOKEN حيث في ملف main.dart ستقوم بوضع كليهما بهذا الشكل const APP_ID = ''; const Token = ''; ثم تقوم بتعريف ملف main.dart بهذا الشكل import 'dart:async'; import 'package:agora_rtc_engine/rtc_engine.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Live Stream', theme: ThemeData( primarySwatch: Colors.blue, ), home: homePage(), ); } } ثم تقوم بتعريف homePage بهذا الشكل class homePage extends StatefulWidget { @override State<StatefulWidget> createState() => IndexState(); } class IndexState extends State<homePage> { final _channelController = TextEditingController(); bool _validateError = false; ClientRole _role = ClientRole.Broadcaster; @override void dispose() { // dispose input controller _channelController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Agora Flutter QuickStart'), ), body: Center( child: Container( padding: const EdgeInsets.symmetric(horizontal: 20), height: 400, child: Column( children: <Widget>[ Row( children: <Widget>[ Expanded( child: TextField( controller: _channelController, decoration: InputDecoration( errorText: _validateError ? 'Channel name is mandatory' : null, border: UnderlineInputBorder( borderSide: BorderSide(width: 1), ), hintText: 'Channel name', ), )) ], ), Column( children: [ ListTile( title: Text(ClientRole.Broadcaster.toString()), leading: Radio( value: ClientRole.Broadcaster, groupValue: _role, onChanged: (ClientRole value) { setState(() { _role = value; }); }, ), ), ListTile( title: Text(ClientRole.Audience.toString()), leading: Radio( value: ClientRole.Audience, groupValue: _role, onChanged: (ClientRole value) { setState(() { _role = value; }); }, ), ) ], ), Padding( padding: const EdgeInsets.symmetric(vertical: 20), child: Row( children: <Widget>[ Expanded( child: RaisedButton( onPressed: joinStream, child: Text('Join'), color: Colors.green, textColor: Colors.black, ), ) ], ), ) ], ), ), ), ); } /// زر الانضمام إلى البث Future<void> joinStream() async { setState(() { _channelController.text.isEmpty ? _validateError = true : _validateError = false; }); if (_channelController.text.isNotEmpty) { // انتظر إذن الكاميرا والميكروفون await _handleCameraAndMic(); // أدخل صفحة البث المباشر وانضم إلى القناة باستخدام اسم القناة والدور المحدد في صفحة تسجيل الدخول await Navigator.push( context, MaterialPageRoute( builder: (context) => CallPage( channelName: _channelController.text, role: _role, ), ), ); } } // لتفعيل الكاميرا و المايكرفون Future<void> _handleCameraAndMic() async { await PermissionHandler().requestPermissions( [PermissionGroup.camera, PermissionGroup.microphone], ); } } كود صفحة البث , يوجد شرح مضمن بداخله للدوال class livePage extends StatefulWidget { final String channelName; final ClientRole role; const livePage({Key key, this.channelName, this.role}) : super(key: key); @override _livePageState createState() => _livePageState(); } class _livePageState extends State<CallPage> { final _users = <int>[]; final _infoStrings = <String>[]; bool muted = false; RtcEngine _engine; @override void dispose() { _users.clear(); _engine.leaveChannel(); _engine.destroy(); super.dispose(); } @override void initState() { super.initState(); initialize(); } Future<void> initialize() async { if (APP_ID.isEmpty) { setState(() { _infoStrings.add( 'مفقود ، يرجى تقديم APP_ID الخاص بك في', ); _infoStrings.add('Agora Engine is not starting'); }); return; } await _initAgoraRtcEngine(); _addAgoraEventHandlers(); /// Join channel await _engine.joinChannel(Token, widget.channelName, null, 0); } // تخطيط شريط الأدوات Widget _toolbar() { if (widget.role == ClientRole.Audience) return Container(); return Container( alignment: Alignment.bottomCenter, padding: const EdgeInsets.symmetric(vertical: 48), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RawMaterialButton( onPressed: _onToggleMute, child: Icon( muted ? Icons.mic_off : Icons.mic, color: muted ? Colors.white : Colors.blueAccent, size: 20.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: muted ? Colors.blueAccent : Colors.white, padding: const EdgeInsets.all(12.0), ), RawMaterialButton( onPressed: () => _onCallEnd(context), child: Icon( Icons.call_end, color: Colors.white, size: 35.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: Colors.redAccent, padding: const EdgeInsets.all(15.0), ), RawMaterialButton( onPressed: _onSwitchCamera, child: Icon( Icons.switch_camera, color: Colors.blueAccent, size: 20.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: Colors.white, padding: const EdgeInsets.all(12.0), ) ], ), ); } Future<void> _initAgoraRtcEngine() async { RtcEngineConfig config = RtcEngineConfig(APP_ID); _engine = await RtcEngine.createWithConfig(config); await _engine.setChannelProfile(ChannelProfile.LiveBroadcasting); await _engine.setClientRole(widget.role); } void _addAgoraEventHandlers() { _engine.setEventHandler(RtcEngineEventHandler(error: (code) { setState(() { final info = 'onError: $code'; _infoStrings.add(info); }); }, joinChannelSuccess: (channel, uid, elapsed) { setState(() { final info = 'onJoinChannel: $channel, uid: $uid'; _infoStrings.add(info); }); }, leaveChannel: (stats) { setState(() { _infoStrings.add('onLeaveChannel'); _users.clear(); }); }, userJoined: (uid, elapsed) { setState(() { final info = 'userJoined: $uid'; _infoStrings.add(info); _users.add(uid); }); }, userOffline: (uid, elapsed) { setState(() { final info = 'userOffline: $uid'; _infoStrings.add(info); _users.remove(uid); }); })); } /// تخطيط شريط الأدوات Widget _toolbar() { if (widget.role == ClientRole.Audience) return Container(); return Container( alignment: Alignment.bottomCenter, padding: const EdgeInsets.symmetric(vertical: 48), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ RawMaterialButton( onPressed: _onToggleMute, child: Icon( muted ? Icons.mic_off : Icons.mic, color: muted ? Colors.white : Colors.blueAccent, size: 20.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: muted ? Colors.blueAccent : Colors.white, padding: const EdgeInsets.all(12.0), ), RawMaterialButton( onPressed: () => _onCallEnd(context), child: Icon( Icons.call_end, color: Colors.white, size: 35.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: Colors.redAccent, padding: const EdgeInsets.all(15.0), ), RawMaterialButton( onPressed: _onSwitchCamera, child: Icon( Icons.switch_camera, color: Colors.blueAccent, size: 20.0, ), shape: CircleBorder(), elevation: 2.0, fillColor: Colors.white, padding: const EdgeInsets.all(12.0), ) ], ), ); } // لوحة معلومات لعرض السجلات Widget _panel() { return Container( padding: const EdgeInsets.symmetric(vertical: 48), alignment: Alignment.bottomCenter, child: FractionallySizedBox( heightFactor: 0.5, child: Container( padding: const EdgeInsets.symmetric(vertical: 48), child: ListView.builder( reverse: true, itemCount: _infoStrings.length, itemBuilder: (BuildContext context, int index) { if (_infoStrings.isEmpty) { return null; } return Padding( padding: const EdgeInsets.symmetric( vertical: 3, horizontal: 10, ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Flexible( child: Container( padding: const EdgeInsets.symmetric( vertical: 2, horizontal: 5, ), decoration: BoxDecoration( color: Colors.yellowAccent, borderRadius: BorderRadius.circular(5), ), child: Text( _infoStrings[index], style: TextStyle(color: Colors.blueGrey), ), ), ) ], ), ); }, ), ), ), ); } // وقف البث المباشر void _onCallEnd(BuildContext context) { Navigator.pop(context); } /// صامت void _onToggleMute() { setState(() { muted = !muted; }); _engine.muteLocalAudioStream(muted); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Agora Flutter QuickStart'), ), backgroundColor: Colors.black, body: Center( child: Stack( children: <Widget>[ _panel(), _toolbar(), ], ), ), ); } } هذه الأكواد مجرد أمثلة يمكنك مراجعة توثيق agora من هنا فكل شيء مشروح بشكلٍ مفصل لكيفية تضمين المكتبة و الاشتراك في الخدمة.
- 1 جواب
-
- 1
-
