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

بلال زيادة

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

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

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

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

    30

كل منشورات العضو بلال زيادة

  1. لو لاحظت هنا Locale(value.locale), يمكنك جلب القيمة المخزنة في local storeage, ايضا لاحظ في Provider عند قمنا بتغيير اللغة قمنا بحفظها في Shared ثم تخزينها في local Storage _getLanguage() async { await _initialPreferences(); _locale = _preferences.getString('language') ?? 'en'; notifyListeners(); } وقمنا بوضع getter String _locale = 'en'; String get locale => _locale لو راجعت الكود جيدا, لكان سهل عليم الأمر كثير.
  2. تمام, سأحاول تعديل الكود ومن ثم إخبارك بالنتيجة.
  3. أولا يجب تنزيل الحزم التالية من pub.dev intl: ^0.17.0 shared_preferences: ^0.5.12+4 provider: ^4.3.2+3 localstorage: ^3.0.6+9 intl_translation: git: url: https://github.com/nt4f04uNd/intl_translation ثم تنشأ واجهة لعرض اللغات مثل import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; import '../../common/constants.dart'; import '../../generated/l10n.dart'; import '../../models/init_model.dart'; class Languages extends StatefulWidget { @override _LanguagesState createState() => _LanguagesState(); } class _LanguagesState extends State<Languages> { @override Widget build(BuildContext context) { List<Widget> list = []; List<Map<String, dynamic>> languages = getAlllanguages(context); for (var i = 0; i < languages.length; i++) { list.add( Card( elevation: 0, margin: EdgeInsets.all(2), child: ListTile( leading: SvgPicture.asset( 'assets/flags/${languages[i]["image"]}.svg', fit: BoxFit.cover, width: 30, height: 20, ), title: Text(languages[i]["name"]), onTap: () async { print(languages[i]["code"]); await Provider.of<InitModel>(context, listen: false) .changeLanuguage(context, languages[i]["code"]); setState(() {}); }, ), ), ); } /*return Consumer<AuthProvider>(builder: (context, user, child) { });*/ return Scaffold( appBar: AppBar( elevation: 0, title: Text( S.of(context).language, ), backgroundColor: Theme.of(context).primaryColor, ), body: SingleChildScrollView( child: Column( children: [ ...list, ], ), ), ); } } ثم تنشأ قائمة اللغات و ممكن تخزنها في ملف اسمه constants.dart و تكون القائمة بهذا الشكل Function getAlllanguages = ([context]) { return [ { "id": 1, "name": "English", "image": "en", "code": "en", }, { "id": 2, "name": "Arabic", "image": "ar", "code": "ar", }, { "id": 2, "name": "Iran", "image": "ir", "code": "fa", } ]; }; ثم يمكنك إنشاء Provider ليتم تغيير اللغة بدون إيقافه و تشغيله مرة أخرى class InitModel with ChangeNotifier { Map<String, dynamic> appConfig; bool isLoading = true; String message; String _locale = 'en'; String get locale => _locale; final String key = "theme"; SharedPreferences _preferences; bool _darkMode = false; bool get darkMode => _darkMode; InitModel() { _darkMode = false; _locale = 'en'; _loadFromPreferences(); _getLanguage(); } _initialPreferences() async { if (_preferences == null) _preferences = await SharedPreferences.getInstance(); } _savePreferences() async { await _initialPreferences(); _preferences.setBool(key, _darkMode); } _loadFromPreferences() async { await _initialPreferences(); _darkMode = _preferences.getBool(key) ?? false; notifyListeners(); } toggleChangeTheme() { _darkMode = !_darkMode; _savePreferences(); notifyListeners(); } _getLanguage() async { await _initialPreferences(); _locale = _preferences.getString('language') ?? 'en'; notifyListeners(); } Future<void> changeLanuguage(BuildContext context, String countryCode) async { await _initialPreferences(); _locale = countryCode; _preferences.setString("language", _locale); /*try { SharedPreferences preferences = await SharedPreferences.getInstance(); //_locale = countryCode; await preferences.setString('language', countryCode); final LocalStorage storage = new LocalStorage('locale'); storage.setItem('locale', countryCode); _locale = preferences.getString('language'); _savePreferences(); return true; } catch (err) { return false; }*/ notifyListeners(); } void loadAppConfig() async { try { if (kAppConfig.indexOf('http') != -1) { final appJson = await http.get(Uri.encodeFull(kAppConfig), headers: {"Accept": "application/json"}); appConfig = convert.jsonDecode(appJson.body); } else { final appJson = await rootBundle.loadString(kAppConfig); appConfig = convert.jsonDecode(appJson); } isLoading = false; notifyListeners(); } catch (e) { isLoading = false; message = e.toString(); notifyListeners(); } } } class App { Map<String, dynamic> appConfig; App(this.appConfig); } ثم إضافة الكود التالي localizationsDelegates: [ RefreshLocalizations.delegate, S.delegate, GlobalWidgetsLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, DefaultCupertinoLocalizations.delegate, ], supportedLocales: S.delegate.supportedLocales, //locale: Locale('fa'), locale: Locale(value.locale), localeResolutionCallback: (Locale locale, Iterable<Locale> supportedLocales) { return locale; }, في MaterialApp, ثم تعريف final LocalStorage storage = new LocalStorage('locale'); في نفس الكلاس الذي يحتوي MaterialApp. في البداية قد تواجهك صعوبات في تنفيذ هذا الكود لأنه متقدم جداً, وربما تواجهك بعض الأخطاء ولكن يمكننا بعد قيامك خطوة بخطوة من تنفيذ الأكواد من فعل ما تريد. ملاحظة : جميع الأكواد مجربة ومستخدمة قبل ذلك.
  4. يمكنك تجريب الطريقة الثانية ومن ثم إخباري بالنتيجة.
  5. ولكن هناك دوال في shared_preferences لتتعامل مع بيانات من نوع bool , مثل setBool , getBool لماذا لا تستخدمها مباشرة ؟ يمكنك استخدام setBool بهذا الشكل _saveOptions() async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setBool('option', true); } ويمكنك استخدام getBool بهذا الشكل SharedPreferences prefs = await SharedPreferences.getInstance(); bool boolValue = prefs.getBool('option'); أم هل تقصد تريد إضافة بيانات بهذا الشكل ؟ final String _kNotificationsPrefs = "allowNotifications"; final String _kSortingOrderPrefs = "sortOrder"; Future<bool> getAllowsNotifications() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getBool(_kNotificationsPrefs) ?? false; } Future<bool> setAllowsNotifications(bool value) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.setBool(_kNotificationsPrefs, value); }
  6. إذا تقصد موقع ويب, صحيح يمكنك ذلك باستخدام اللغات المذكورة ووجب التنبيه أن laravel هو إطار عمل مبني على لغة PHP.
  7. لا يوجد صورة مرفقة, أرجوا ان تقوم بإرفاقها.
  8. تمام, يبدو أنك لم تقم بجلب حزمة Geolocator بشكل مناسب لأنه الخصائص هذه من الحزمة يمكنك مراجعة التوثيق من هنا, وجميع الخصائص الموجودة في الكود يمكنك التحقق منها ايضا. لم أنشئ لك كود كامل لأخفاء و إظهار الخريطة , قمت فقط بوضع كود ليفحص GPS إذا شغال أو لا, باقي التفاصيل يمكنك تطبيقها بناءاً على ما تريد. بما أنه يمكنك فحص و معرفة حالة GPS يمكنك التحكم في إظهار و إخفاء الخريطة كما تريد.
  9. كل نوع قاعدة بيانات في فلاتر لديها مكتبة في pub.dev يمكنك من تثبيتها واستخدامها في مشروعك.
  10. يبدو أنك نسيت إضافة use Rebing\GraphQL\Support\Type as GraphQLType; إلى ملف app/GraphQL/Types/ItemType.php ثم جعل الكلاس يرث من GraphQLType, كما في الكود التالي <?php namespace App\GraphQL\Types; use App\Item; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Type as GraphQLType; class ItemType extends GraphQLType { } ثم لم تقم بإنشاء ملف ItemQuery بهذا الشكل <?php namespace App\GraphQL\Queries; use App\Item; use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Facades\GraphQL; use Rebing\GraphQL\Support\Query; class ItemQuery extends Query { protected $attributes = [ 'name' => 'item', ]; public function type(): Type { return GraphQL::type('Item'); } public function args():array { return [ 'id' => [ 'name' => 'id', 'type' => Type::int(), 'rules' => ['required'] ], ]; } public function resolve($root, $args) { return Item::findOrFail($args['id']); } } يمكنك تجربة ذلك ومن إخبارنا بالنتيجة, ولكن بشكل عام, يمكنك إرفاق ملفات مشروعك هنا ليتم مساعدتك في حل المشكلة. او يمكنك مراجعة التوثيق الخاص بالحزمة على github من هنا.
  11. لفهم ما يفعله yield , يجب أن تفهم ما هي المولدات (generators). وقبل أن تتمكن من فهم المولدات , يجب أن تفهم العناصر التكرارية (iterables). العناصر التكرارية iterables: عند إنشاء قائمة , يمكنك قراءة عناصرها واحدًا تلو الآخر >>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3 المولدات Generators : المولدات هي مكررات , نوع من التكرارات لا يمكنك تكرارها إلا مرة واحدة. لا تخزن المولدات جميع القيم في الذاكرة , بل تولد القيم بسرعة: >>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4 Yield: العائد عبارة عن كلمة رئيسية تستخدم مثل return , باستثناء أن function ستعيد مولدًا (generator). >>> def create_generator(): ... mylist = range(3) ... for i in mylist: ... yield i*i ... >>> mygenerator = create_generator() # create a generator >>> print(mygenerator) # mygenerator is an object! <generator object create_generator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 4
  12. يمكنك استخدام datetime.strptime لتحليل السلاسل إلى datetimes ,يمكنه التعامل مع جميع أنواع التنسيقات , بالتنسيق الذي تحدده سلسلة التنسيق التي تقدمها لها from datetime import datetime datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p') أو يمكنك استخدام مكتبة dateutil, يمكنك تنزيلها باستخدام هذا الأمر pip install python-dateutil ثم يمكنك استخدامها بهذا الشكل from dateutil import parser parser.parse("Aug 28 1999 12:00AM") هذه المكتبة يمكنها التعامل مع معظم تنسيقات التاريخ , بما في ذلك التنسيقات التي تحتاج إلى تحليلها. إنها أكثر ملاءمة من strptime حيث يمكنها تخمين التنسيق الصحيح في معظم الأوقات.
  13. ستقوم بتثبيت حزمة geolocator ثم تعمل check على gps و تظهر رسالة إذا لم يكن مفعل بهذا الشكل var isGpsEnabled = await Geolocator().isLocationServiceEnabled(); Future _checkGps() async { if (!(await Geolocator().isLocationServiceEnabled())) { if (Theme.of(context).platform == TargetPlatform.android) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text("لا يمكن جلب الموقع الحالي"), content: const Text('الرجاء تفعيل GPS'), actions: <Widget>[ FlatButton( child: Text('Ok'), onPressed: () { final AndroidIntent intent = AndroidIntent( action: 'android.settings.LOCATION_SOURCE_SETTINGS'); intent.launch(); Navigator.of(context, rootNavigator: true).pop(); }, ), ], ); }, ); } } } ستقوم بتثبيت الحزمتين google_maps_flutter location يمكنك البحث عنهما من خلال موقع pub.dev من هنا. في المسار التالي android/app/src/main/directory. ستقوم بفتح ملف AndroidManifest.xml ستقوم بوضع التالي <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:location/location.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { LatLng _initialcameraposition = LatLng(20.5937, 78.9629); GoogleMapController _controller; Location _location = Location(); void _onMapCreated(GoogleMapController _cntlr) { _controller = _cntlr; _location.onLocationChanged.listen((l) { _controller.animateCamera( CameraUpdate.newCameraPosition( CameraPosition(target: LatLng(l.latitude, l.longitude),zoom: 15), ), ); }); } @override Widget build(BuildContext context) { return Scaffold( body: Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: Stack( children: [ GoogleMap( initialCameraPosition: CameraPosition(target: _initialcameraposition), mapType: MapType.normal, onMapCreated: _onMapCreated, myLocationEnabled: true, ), ], ), ), ); } } في الكود إعلاه هنا يتم وضع Lat , lng إفتراضي, ثم يأتي دور دالة _onMapCreated كلما تغير موقع الجهاز, سيتم نقل الكاميرا إلى الموقع الجديد. أخبرنا إلى أين وصلت في الكود الخاص بك و ما هي المشاكل وسنساعدك بإذن الله.
  14. هل يمكنك إرفاق ملفات مشروعك كاملاً مع الداتا بيز الخاصة به؟
  15. يمكنك استخدام list بهذا الشكل list(my_dataframe) او استخدام columns.values مع اسم dataframe list(my_dataframe.columns.values)
  16. لا يوجد شيء اسمه داتا بيز أكثر طلباَ في السوق, بل كل مشروع حسب متطلباته يتم تحديد أي نوع داتا بيز يتم استخدامها فلو كان موقع يعتمد على الباك أند من جهة السيرفر فربما يتم استخدام mysql و لو كان التطبيق لا يدعم باك اند يمكنك استخدام sqlite. وهذا ما يحدده طبيعة المشروع.
  17. يجب زيادة timeout في S3Client بهذا الشكل $s3 = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => 'us-west-2', 'credentials' => $credentials, 'http' => [ 'timeout' => 390 ] ]); وفي لارافل يمكنك من فتح ملف filesystems.php الموجود بداخل مجلد config وفي مصفوفة disk في S3 يتم وضع التالي 'http' => [ 'timeout' => 390 ] لتصبح بهذا الشكل 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'http' => [ 'timeout' => 360 ] ],
  18. يجب وضع implements SluggableInterfac في المودل الذي تستخدمه كما في الشكل التالي class Post extends Eloquent implements SluggableInterface { } ومن ثم يمكن استخدامها بهذا الشكل $post = Post::create([ 'title' => 'My Awesome Blog Post', ]); ثم يمكن استرداد slug echo $post->slug; إذا أردت القراءة أكثر يمكنك زيارة الرابط من هنا
  19. يرجى وضع صورة مناسبة للمشكلة, فأنني لا استطيع رؤية المشكلة بشكل مناسب.
  20. أنصحك بعدم استخدام heroku إلا للتجريب فقط و إذا كان مشروعك بشكل دائم قم بشراء حزمة من heroku أو قم بالأشتراك في استضافة او سيرفر كلاود حتى لا تحدث لك هذه المشكلة مجدداً, لذلك لا تضع مشاريع فعلية على heroku المجانية. ثم يمكنك تخزين الصور بداخل مجلد Public حتى تتفادى عمليات المسح المتكرر من قبل شركة heroku فمثلاً, if($request->hasFile('image')){ $img = time() . '.' . $request->file('image')->getClientOriginalExtension(); $category->image = \URL::to('').'/categories/images/' . $img; $request->image->move(public_path('categories/images'), $img); } أو استخدام AWS S 3 بهذا الشكل $files = $request->file('image'); $errors = []; $i = 0; foreach ($files as $file) { $flebImages = new FlebImage(); $watermark = Image::make(public_path('images/logo.png')); $name = time() . $file->getClientOriginalName(); $img = Image::make($file); $watermarkSize = $img->width() - 20; //size of the image minus 20 margins //#2 $watermarkSize = $img->width() / 5; //half of the image size //#3 $resizePercentage = 70;//70% less then an actual image (play with this value) $watermarkSize = round($img->width() * ((100 - $resizePercentage) / 100), 2); //watermark will be $resizePercentage less then the actual width of the image // resize watermark width keep height auto $watermark->resize(70, 70, function ($constraint) { $constraint->aspectRatio(); }); $watermark->opacity(50); //insert resized watermark to image center aligned //$img->insert($watermark, 'center'); /*$img->resize(500, 500, function ($constraint) { $constraint->aspectRatio(); //$constraint->upsize(); });*/ //$img->insert(public_path('images/logo.jpeg'), 'bottom-right', 10, 10); $img->insert($watermark, 'bottom-right', 10, 10); $filePath = 'flebs/'. $flebFolder . '/' . $name; //detach method is the key! Hours to find it... : $resource = $img->stream()->detach(); \Storage::disk('s3')->put($filePath, $resource); $flebImages->image = \Storage::disk('s3')->url($filePath); $flebImages->save(); }
  21. ستقوم بتخزين id محمد و تخزين id للرسائل بحيث عند إرسال الرسالة يتم حفظها, ويكون الاستعلام بهذا الشكل $sql = "SELECT * FROM messages WHERE user_id = {$user_id} and msg_id = {$msg_id}"; $sql = mysqli_query("معرف الاتصال", $sql); وهكذا تستطيع عمل Loop خاصة للرسائل الخاصة بمحمد و الخاصة بالرسائل. الفكرة بعمل جدول للإعضاء و جدول للرسائل و جدول للمحادثات داخل كل رسالة. أو يمكنك إرفاق ملفات مشروعك هنا لنساعدك في حلها.
  22. يمكنك تنفيذ الأمر التالي في cmd php artisan tinker ثم تقوم بالأستعلام عن الحساب الذي تريد تغيير كلمة المرور له. $user = App\User::where('email', 'user@example.com')->first(); $user->password = Hash::make('password'); $user->save(); أو من خلال ملف web.php يمكنك وضع مسار لتغيير كلمة المرور بهذا الشكل <?php Route::get('changepassword', function() { $user = App\User::where('email', 'admin@laravel.com')->first(); $user->password = Hash::make('123456'); $user->save(); echo 'Password changed successfully.'; }); ?>
  23. يمكنك ايضا التحقق من ذلك باستخدام ()values sampleDict = {'a': 100, 'b': 200, 'c': 300} 200 in sampleDict.values()
  24. يجب أن تكون مجانية، حتى لا تتعدى حقوق الطبع و النشر الموجودة على الصور.
×
×
  • أضف...