-
المساهمات
4376 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
30
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو بلال زيادة
-
يمكنك أستخدام 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
-
صحيح هي كذلك وهنا تستطيع إضافة اكثر من سعر للمنتج الواحد ويكون كامل التحكم من خلالك.
- 11 اجابة
-
- 1
-
لا المنتج يكون له أكثر من سعر وبناء على العملة المخزنة أظهر المنتج بالسعر المخزن. للأسف لا أعلم هل يوجد أو لا ولكن الفكرة تعتمد على أن يكون المنتج له أكثر من سعر.
- 11 اجابة
-
- 1
-
لم أتعامل مع APIS يوفر مثل هذه الخاصية من قبل, ولكن أعتمد في طريقتي على api الذي استخدمه في تطبيقي من حيث يكون للمنتج أكثر من سعر مثل USD , EUR. بحيث يكون هناك واجهة أخرى يختار منه المستخدم العملة التي يريد إظهارها في المنتجات , فعند الضغط على العملة المفضلة أقوم بتخزينها في SharedPrefrence و من ثم أمررها لِ Provider المسؤول عن تحديث الواجهة بالسعر المختار و من ثم Provider يقوم بتمرير العملة إلى API ويجلب بيانات المنتجات بالعملة المرسلة, انه موضوع معقد نوعاً ما ولكن يمكن تطبيقه بشكلٍ ما. الشرح بالكود لما تم ذكره مسبقاً . أقوم بتعريف مجموعة من العملات بناء على ما يتم استخدامه في api مثل const kCurrencies = { "Currencies": [ { "symbol": "\$", "currency": "USD", }, { "symbol": "\€", "currency": "EUR" }, ], }; ثم في واجهة أختيار العملة أضع التالي List getAllCurrencies = kCurrencies["Currencies"] ?? []; ثم أقوم بعمل loop على العملات المخزنة مسبقاً for (var i = 0; i < getAllCurrencies.length; i++) Column( children: <Widget>[ Card( child: ListTile( title: Text( '${getAllCurrencies[i]["currency"]} (${getAllCurrencies[i]["symbol"]})'), onTap: () { setState(() { currency = getAllCurrencies[i]["currency"]; }); Provider.of<InitModel>(context, listen: false) .changeCurrency(getAllCurrencies[i]["currency"], context); }, trailing: currency == getAllCurrencies[i]["currency"] ? const Icon(Icons.done) : Container( width: 50, ), ), ), if (i != getAllCurrencies.length - 1) const Divider( color: Colors.black, ), ], ) ثم أمرر العملة إلى دالة changeCurrency التي بدورها أقوم بتخزين العملة و تمريرها إلى Api لأرجع بيانات المنتجات بالعملة المختارة. Future<void> changeCurrency(String item, BuildContext context) async { Provider.of<CartModel>(context, listen: false).changeCurrency(item); SharedPreferences prefs = await SharedPreferences.getInstance(); currency = item; await prefs.setString("currency", currency); notifyListeners(); }
- 11 اجابة
-
- 2
-
يمكنك استخدام برنامج github desktop بحيث تقومين بسحب نسخة من هذا المستودع و من ثم أي تعديلات تقومين بها تستطعين دفعها مرة أخرى على المستودع. من خلال البرنامج قومي بالضغط على File - Clone repository ثم تختارين المستودع الذي تريدين القيام بعمل نسخة منه من خلال تنزيله على الجهاز. ثم أي تعديلات تقومين بها في الملفات سوف تظهر على البرنامج و ستظهر لكِ كلمة commit master ومن ثم بعد الضغط عليها ستظهر كلمة push قومي بالضغط عليها لعمل دفع للملفات المعدلة على المستودع مرة أخرى.
-
[array[i], array[j]] = [array[j], array[i]]; ES6 الجديد يسمح بتعيين متغيرين في وقت واحد. يكون هذا مفيدًا بشكل خاص عندما نريد تبديل قيم متغيرين , حيث يمكننا القيام بذلك في سطر واحد من التعليمات البرمجية.
- 7 اجابة
-
- 1
-
ستقوم بإنشاء مشروع جديد وليكن اسمه excel_project. ثم ستقوم بتضمين مكتبة poi-5.0.0.jar إلى مشروعك. في ملف AndroidManifest.xml , أضف إذن "WRITE_EXTERNAL_STORAGE" حيث نطلب الوصول إلى وحدة التخزين الخارجية لحفظ ملف Excel. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ثم في ملف MainActivity.java في دالة onCreate يمكنك إضافة زر إنشاء الملف كالتالي protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=findViewById(R.id.exelCreate); button.setOnClickListener(this); } ثم في دالة onClick تقوم بإضافة التالي public void onClick(View v) { Workbook wb=new HSSFWorkbook(); Cell cell=null; CellStyle cellStyle=wb.createCellStyle(); cellStyle.setFillForegroundColor(HSSFColor.LIGHT_BLUE.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //الآن نقوم بإنشاء ورقة Sheet sheet=null; sheet = wb.createSheet("Name of sheet"); //إنشاء الآن العمود والصف Row row =sheet.createRow(0); cell=row.createCell(0); cell.setCellValue("Name"); cell.setCellStyle(cellStyle); cell=row.createCell(1); cell.setCellValue("Number"); cell.setCellStyle(cellStyle); sheet.setColumnWidth(0,(10*200)); sheet.setColumnWidth(1,(10*200)); File file = new File(getExternalFilesDir(null),"myexcel.xls"); FileOutputStream outputStream =null; try { outputStream=new FileOutputStream(file); wb.write(outputStream); Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_LONG).show(); } catch (java.io.IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(),"NO OK",Toast.LENGTH_LONG).show(); try { outputStream.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
-
app.get() يشبه إلى حد كبير router.get() App Object عبارة عن جهاز توجيه ( router )يحتوي أيضًا على بعض الخصائص والدول الأخرى عليه. لذلك , فإن معظم أي دالة من كائن التوجيه ( route object ) تكون أيضًا على كائن app ، ولكن ليس العكس. غالبًا ما يكون من المفيد تجميع مسارات التوجيه لجزء معين من الموقع معًا والوصول إليها باستخدام route-prefix (على سبيل المثال , قد يحتوي الموقع الذي يحتوي على Wiki على جميع المسارات ذات الصلة بـ wiki في ملف واحد ويتم الوصول إليها ببادئة المسار من / ويكي /). في Express يتم تحقيق ذلك باستخدام كائن express.Router. على سبيل المثال , يمكننا إنشاء مسار wiki الخاص بنا في وحدة نمطية تسمى wiki.js , ثم تصدير كائن جهاز التوجيه , const express = require('express'); const router = express.Router(); router.get('/', function(req, res) { res.send('صفحة رئيسية'); }); router.get('/about', function(req, res) { res.send('حول wiki'); }); module.exports = router; يمكنك القراءة أكثر عن هذا الموضوع من خلال توثيق routing على expressjs من هنا.
-
يمكنك استخدام share من هنا. في تطبيقك ويمكنك استخدام Share.share('check out my website https://example.com'); تأخذ Share أيضًا موضوعًا اختياريًا سيتم استخدامه عند المشاركة في البريد الإلكتروني. Share.share('check out my website https://example.com', subject: 'Look what I made!'); لمشاركة ملف واحد أو عدة ملفات ، قم باستدعاء طريقة shareFiles الثابتة في أي مكان في رمز Dart الخاص بك. اختياريًا يمكنك أيضًا تمرير النص والموضوع. Share.shareFiles(['${directory.path}/image.jpg'], text: 'Great picture'); Share.shareFiles(['${directory.path}/image1.jpg', '${directory.path}/image2.jpg']); ومن خلال الكود الكامل import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:share/share.dart'; import 'image_previews.dart'; void main() { runApp(DemoApp()); } class DemoApp extends StatefulWidget { @override DemoAppState createState() => DemoAppState(); } class DemoAppState extends State<DemoApp> { String text = ''; String subject = ''; List<String> imagePaths = []; @override Widget build(BuildContext context) { return MaterialApp( title: 'Share Plugin Demo', home: Scaffold( appBar: AppBar( title: const Text('Share Plugin Demo'), ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ TextField( decoration: const InputDecoration( labelText: 'Share text:', hintText: 'Enter some text and/or link to share', ), maxLines: 2, onChanged: (String value) => setState(() { text = value; }), ), TextField( decoration: const InputDecoration( labelText: 'Share subject:', hintText: 'Enter subject to share (optional)', ), maxLines: 2, onChanged: (String value) => setState(() { subject = value; }), ), const Padding(padding: EdgeInsets.only(top: 12.0)), ImagePreviews(imagePaths, onDelete: _onDeleteImage), ListTile( leading: Icon(Icons.add), title: Text("Add image"), onTap: () async { final imagePicker = ImagePicker(); final pickedFile = await imagePicker.getImage( source: ImageSource.gallery, ); if (pickedFile != null) { setState(() { imagePaths.add(pickedFile.path); }); } }, ), const Padding(padding: EdgeInsets.only(top: 12.0)), Builder( builder: (BuildContext context) { return ElevatedButton( child: const Text('Share'), onPressed: text.isEmpty && imagePaths.isEmpty ? null : () => _onShare(context), ); }, ), const Padding(padding: EdgeInsets.only(top: 12.0)), Builder( builder: (BuildContext context) { return ElevatedButton( child: const Text('Share With Empty Origin'), onPressed: () => _onShareWithEmptyOrigin(context), ); }, ), ], ), ), )), ); } _onDeleteImage(int position) { setState(() { imagePaths.removeAt(position); }); } _onShare(BuildContext context) async { // A builder is used to retrieve the context immediately // surrounding the ElevatedButton. // // The context's `findRenderObject` returns the first // RenderObject in its descendent tree when it's not // a RenderObjectWidget. The ElevatedButton's RenderObject // has its position and size after it's built. final RenderBox box = context.findRenderObject() as RenderBox; if (imagePaths.isNotEmpty) { await Share.shareFiles(imagePaths, text: text, subject: subject, sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); } else { await Share.share(text, subject: subject, sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); } } _onShareWithEmptyOrigin(BuildContext context) async { await Share.share("text"); } }
- 3 اجابة
-
- 1
-
الفكرة بسيطة كل ما عليك عند إرسال الكود في رسالة sms أيضا قم بتخزين الكود في جدول يحتوي على الأكواد التي تتولد مع تخزين token جهاز الشخص الذي سجل, وعند مقارنة الكود الذي وصل أنه تم إضافته من نفس التوكن للجهاز مع token المخزن تقوم بإنشاء الحدث الخاص بك.
- 7 اجابة
-
- 3
-
يمكنك إنشاء مستودع جديد على github وبعد إنشاء المستودع تظهر لك صفحة بها تعليمات الرفع مثل echo "# text" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin هنا رابط المستودع git push -u origin main وعليك تنفيذ التعليمات للتمكن من رفع الملفات على المستودع, بعد الرفع يمكنك الرجوع إلى صفحة التعليمات و تحديثها سوف تجد جميع ملفاتك.
- 6 اجابة
-
- 1
-
تأكد من تقليل حجم ملفات css, js و الصور أيضا أو تاكد من مسار الملفات انها صحيحة أو ايضا لا يوجد أخطاء في أكواد js. 2- يجب تغيير مسار الصورة header{ background-image: url(img/header-img.png); background-size: 100%; background-repeat: no-repeat; background-position: bottom center; } لأنك تستخدم تأثيرات تخرج من يمين أو يسار الصفحة لذلك يظهر شريط التمرير ويختفي مجرد إكتمال البلوك كاملاً @media (min-width: 576px) { ... } // Medium devices (tablets, 768px and up) @media (min-width: 768px) { ... } // Large devices (desktops, 992px and up) @media (min-width: 992px) { ... } // Extra large devices (large desktops, 1200px and up) @media (min-width: 1200px) { ... } لا توجد تنسيقات لإزرار المتاجر. يمكنك استخدام <script src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js" integrity="sha512-Eak/29OTpb36LLo2r47IpVzPBLXnAMPAVypbSZiZ4Qkf8p/7S/XRG5xp7OKWPPYfJT6metI+IORkR5G8F900+g==" crossorigin="anonymous"></script> أو <script src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.js" integrity="sha512-Rd5Gf5A6chsunOJte+gKWyECMqkG8MgBYD1u80LOOJBfl6ka9CtatRrD4P0P5Q5V/z/ecvOCSYC8tLoWNrCpPg==" crossorigin="anonymous"></script> أستخدم المكتبات أفضل لك و توفر عليك العناء والتعب.
- 4 اجابة
-
- 1
-
هل قمتي بتنفيذ جميع الخطوات؟ أو يمكنك تنفيذ الأوامر التالية git pull origin master git push origin master إذا لم ينجح الأمر تأكدي من متابعة الخطوات التالية git init git add . git commit -m "first commit" git branch -M main git remote add origin هنا الرابط git push -u origin main أو يمكنك تنفيذ الأوامر التالية git pull --rebase origin main git push origin main
-
يمكنك استخدام دالتي set, list بحيث تمرر السلسلة الأولى إلى دالة set المضمنة بداخل دالة list مثل الكود التالي t = [1, 2, 3, 1, 2, 5, 6, 7, 8] t = list(set(t)) فتعمل الدالة على حذف العناصر المكررة من السلسلة فيكون الناتج بهذا الشكل [1, 2, 3, 5, 6, 7, 8] ثم نقوم بعمل سلسلة أخرى و يكون بها العناصر الذي لا نريدها في السلسلة الناتجة وهي العناصر [1, 2, 3] فنقوم بوضع التالي s = [1, 2, 3] ثم m = list(set(t) - set(s)) ثم نطبع المتغير m print(m) فتكون النتيجة السلسلة التالية [8, 5, 6, 7] الكود كاملاً t = [1, 2, 3, 1, 2, 5, 6, 7, 8] t = list(set(t)) s = [1, 2, 3] m = list(set(t) - set(s)) print(m)
-
سأقوم بوضع مثال , يمكنك متغير لوضع السعر الإجمالي فيه فيكون كالتالي int sum = 0; ومن ثم وضع متغير List لتخزين بيانات cart بداخله List<Cart> ListCart=[]; ثم بداخل FutureBuilder FutureBuilder( future: myCart, builder: (context, snapshot) { if (snapshot.hasData) { ListCart = snapshot.data; ListCart.forEach((element) { setState((){ sum = sum + element.price; }); }); } return Container(); }); ثم يمكنك جلب السعر النهائي Container( padding: EdgeInsets.all(10), child: Row( children: <Widget>[ Text('$sum'), SizedBox( width: 10, ), Text('الإجمالي'), ], ), ), هل يمكنك رفع ملفات مشروعك بشكل مضغوط لمساعدتك بشكل أكبر, فالأكواد هكذا تكون ناقصة وبها مشاكل.
- 1 جواب
-
- 1