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

Mohammed Abu Yousef

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

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

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

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

    1

أجوبة بواسطة Mohammed Abu Yousef

  1. كيف أستطيع تحويل قيمة قادمة من api بهاذا الشكل

    "category": "1,2,3"

    إلى هذا الشكل

    "category": [1,2,3]

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

    • أعجبني 1
  2. بتاريخ منذ ساعة مضت قال بلال زيادة:

    هناك طريقة وهي استخدام StreamController بحيث هي طريقة من طرق إدارة الحالة في فلاتر. و الأمر معقد جداً و يجب أن تكون على دراية جيدة بكيفية استخدام StreamController. لاحظ بأنه يجب أن تقوم بتعلم StreamController حتى تفهم الإجابة جيداً لأنه في الوهلة الأولى ستجد أن الأمر قد يكون فيه صعوبة 

    يمكنك إنشاء ملف وليكن مسؤول عن التنصت على أي حدث جديد و يعكسه على الواجهة أي يقوم بتنفيذ هذا الحدث على الواجهة و الميزة في ذلك إنها تقوم بتنفيذ الحدث بدون اللجوء إلى بناء نفسها من الصفر و هذا الملف فليكن اسمه StreamProductsBloc.dart ويمكننا تعريف عدة متغيرات في هذا الملف بهذا الشكل 

    
      List<ProductsModel>? products;
    
      final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast();
      final StreamController<int> _categoryController = StreamController<int>.broadcast();
    
      Stream<List<ProductsModel>> get productsStream => _productsController.stream;
    
      StreamSink<int> get fetchProducts => _categoryController.sink;
      Stream<int> get getProductsForCategoriescategory => _categoryController.stream;
    
      APIService? apiService;
    
      int categoryID = 0;
    
    List<ProductsModel>? products;

    بحيث أول شيء نقوم بتعريف الكلاس مودل الخاص بالمنتجات.

    
    final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast();

    و من ثم نقوم بتعريف StreamController ليقوم بالتحكم في العملية , ويتم توفير واجهات مختلفة لإنشاء تدفقات أحداث متنوعة.

    
    final StreamController<int> _categoryController = StreamController<int>.broadcast();

    وحدة تحكم حيث يمكن الاستماع إليه أكثر من مرة .

    
    Stream<List<ProductsModel>> get productsStream => _productsController.stream;

    ثم نقوم بالحصول على البث للمراقبة.

    
    StreamSink<int> get fetchProducts => _categoryController.sink;

    ثم نقوم بإدخال حدث إضافي عن طريق StreamSink. 

    
    StreamProductsBloc()
      {
        //this.categoryID = categoryID;
        this.products = [];
        apiService = APIService();
        _productsController.add(products!);
        _categoryController.add(this.categoryID);
        _categoryController.stream.listen(_fetchCategoriesFromApi);
      }
    
      Future<void> _fetchCategoriesFromApi(int category) async {
        this.products = await apiService!.getProductsForCategories(category);
        _productsController.add(this.products!);
      }
    
      @override
      void dispose(){
        _productsController.close();
        _categoryController.close();
      }

    نقوم بإنشاء دالة جلب بيانات التصنيف عند تمرير id التصنيف و نقوم بإرجاع جميع المنتجات و من ثم نقوم بإضافة هذه البيانات إلى وحدة التحكم.

    
    Future<void> _fetchCategoriesFromApi(int category) async {
        this.products = await apiService!.getProductsForCategories(category);
        _productsController.add(this.products!);
    }

     ثم نقوم بإضافة المنتجات و id التصنيف إلى وحدة التحكم في دالة StreamProductsBloc ثم نقوم بمراقبة الحدث عن طريق استخدام listen 

    
    StreamProductsBloc()
      {
        //this.categoryID = categoryID;
        this.products = [];
        apiService = APIService();
        _productsController.add(products!);
        _categoryController.add(this.categoryID);
        _categoryController.stream.listen(_fetchCategoriesFromApi);
      }

    ثم نقوم بإنشاء ملف واجهة عرض البيانات وليكن مثلاً باسم products_screen.dart و نقوم أولاً بإنشاء نسخة جديدة من الملف الذي قمنا بإنشائه مسبقاً 

    
    StreamProductsBloc streamProductsBloc = StreamProductsBloc();

    ثم ننشأ عدة متغيرات و نعرف TabController لوضع التصنيفات في هذه TabController

    
    bool get wantKeepAlive => true;
    
    HelperApi helperApi = new HelperApi();
    int currentIndex = 0;
    late TabController _tabController;

    ثم نقوم بصنع Widget خاصة بعرض التصنيفات في TabController 

    
    Widget _categories(List<CategoryModel> categoryModel, BuildContext context) {
        _tabController = TabController(
          initialIndex: 0,
          length: categoryModel.length,
          vsync: this,
        );
        return Scaffold(
          appBar: AppBar(
            title: Text(S.of(context).products),
            bottom: TabBar(
              indicatorColor: Color(0XFF117182),
              indicatorWeight: 5,
              controller: _tabController,
              tabs: _tabs(categoryModel),
              isScrollable: true,
              onTap: (int index) {
                streamProductsBloc.fetchProducts
                    .add(this.productsCategories[index].id!);
              },
            ),
          ),
          body: Container(
            child: StreamBuilder(
              stream: streamProductsBloc.productsStream,
              builder: (context, AsyncSnapshot<List<ProductsModel>>? snapshot) {
                switch (snapshot!.connectionState) {
                  case ConnectionState.none:
                    // ignore: todo
                    // TODO: Handle this case.
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  case ConnectionState.waiting:
                    // ignore: todo
                    // TODO: Handle this case.
                    return ShimmerGrid();
                  case ConnectionState.done:
                  case ConnectionState.active:
                    // ignore: todo
                    // TODO: Handle this case.
                    if (snapshot.hasError) {
                      return Center(
                        child: ShimmerGrid(),
                      );
                    } else {
                      if (!snapshot.hasData) {
                        return ShimmerGrid();
                      } else {
                        return _drawProducts(snapshot.data!, context);
                      }
                    }
                }
              },
            ),
          ),
        );
      }

    لاحظ أننا نقوم بجلب منتجات كل تصنيف عند الضغط عليها عن طريق استخدام id هذا التصنيف 

    
    streamProductsBloc.fetchProducts.add(this.productsCategories[index].id!);

    و من ثم نقوم بإضافة هذا الحدث إلى streamProductBloc . 

    ثم نقوم برسم Widget الخاص بالمنتجات 

    
    Widget _drawProducts(List<ProductsModel> products, BuildContext context) {
        final cart = Provider.of<Cart>(context, listen: false);
        var initModel = Provider.of<InitModel>(context, listen: false,);
        var auth = Provider.of<AuthProvider>(context, listen: false);
        return Consumer<WishListProvider>(
            builder: (BuildContext context, wishListData, child) {
        return Container(
          padding: EdgeInsets.only(top: 24),
          child: Column(
            children: [
              Flexible(
                child: GridView.builder(
                  gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                      maxCrossAxisExtent: 200,
                      childAspectRatio: 1 / 2,
                      crossAxisSpacing: 20,
                      mainAxisSpacing: 20),
                  itemCount: products.length,
                  itemBuilder: (context, index) {
                    return Card(
                      clipBehavior: Clip.hardEdge,
                      elevation: 0.9,
                      child: AnimationConfiguration.staggeredList(
                        position: index,
                        duration: const Duration(milliseconds: 375),
                        child: SlideAnimation(
                          verticalOffset: 50.0,
                          child: FadeInAnimation(
                            child: Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: InkWell(
                                onTap: () {
                                  _gotoSingleProduct(products[index], context);
                                },
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                                  children: [
                                    Expanded(
                                      // ignore: unnecessary_null_comparison
                                        child: Stack(
                                          children: [
                                            (products[index].images![0].src != null)
                                                ? Image.network(
                                              products[index].images![0].src!,
                                              width:
                                              MediaQuery
                                                  .of(context)
                                                  .size
                                                  .width,
                                              height: MediaQuery
                                                  .of(context)
                                                  .size
                                                  .height,
                                              fit: BoxFit.cover,
                                            )
                                                : Image.asset(
                                              "assets/images/1.jpeg",
                                              width:
                                              MediaQuery
                                                  .of(context)
                                                  .size
                                                  .width,
                                              height: MediaQuery
                                                  .of(context)
                                                  .size
                                                  .height,
                                              fit: BoxFit.fill,
                                            ),
                                            Positioned.directional(
                                              textDirection: Directionality.of(
                                                  context),
                                              child: Container(
                                                margin: EdgeInsets.symmetric(
                                                    horizontal: 12.0,
                                                    vertical: 10.0),
                                                decoration: BoxDecoration(
                                                    color: Colors.grey[200],
                                                    borderRadius:
                                                    BorderRadius.circular(50.0)),
                                                child: IconButton(
                                                  icon: Icon(
                                                      Icons.favorite_outline),
                                                  onPressed: () {
                                                    //wishListData.getCount(products[index].id!, auth.id!);
                                                    wishListData.addNewWishList(
                                                        price: products[index]
                                                            .price!
                                                            .toString(),
                                                        product: products[index]
                                                            .name!,
                                                        image: products[index]
                                                            .images![0]
                                                            .src!,
                                                        productId: products[index]
                                                            .id,
                                                        userId: auth.id);
                                                    ScaffoldMessenger.of(context)
                                                        .showSnackBar(
                                                      SnackBar(
                                                        content: Text(
                                                          S
                                                              .of(context)
                                                              .add_product_to_wishlist,
                                                        ),
                                                        duration: Duration(
                                                            seconds: 2),
                                                      ),
                                                    );
                                                  },
                                                  iconSize: 20.0,
                                                ),
                                              ),
                                            )
                                          ],
                                        )
                                    ),
                                    Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: Text(
                                        products[index].name!.substring(0, 10),
                                        style: TextStyle(
                                          color: Colors.black,
                                          fontWeight: FontWeight.bold,
                                          fontSize: 18.0,
                                        ),
                                      ),
                                    ),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      mainAxisAlignment:
                                      MainAxisAlignment.spaceBetween,
                                      children: [
                                        Padding(
                                          padding: const EdgeInsets.all(8.0),
                                          child: Text(initModel.currency! +
                                              products[index].price!,
                                            style: TextStyle(
                                              color: Colors.black,
                                              fontSize: 15.0,
                                            ),
                                          ),
                                        ),
                                        IconButton(
                                          icon: Icon(
                                              Icons.add_shopping_cart_outlined),
                                          onPressed: () {
                                            //if(auth.status == Status.Authenticated){
                                            cart.addItem(
                                                products[index].id.toString(),
                                                10.0,
                                                products[index].name!.toString(),
                                                products[index].images![0].src!,
                                                1,
                                                products[index].id.toString());
                                            ScaffoldMessenger.of(context)
                                                .hideCurrentSnackBar();
                                            ScaffoldMessenger.of(context)
                                                .showSnackBar(
                                              SnackBar(
                                                content: Text(
                                                  S
                                                      .of(context)
                                                      .product_added_to_the_cart,
                                                ),
                                                duration: Duration(seconds: 2),
                                                action: SnackBarAction(
                                                  label: S
                                                      .of(context)
                                                      .undo,
                                                  onPressed: () {
                                                    cart.reomveSingleItem(
                                                        products[index]
                                                            .id
                                                            .toString());
                                                  },
                                                ),
                                              ),
                                            );
                                          },
                                        ),
                                      ],
                                    ),
                                    Text(products[index].stockStatus!,
                                      style: TextStyle(
                                        color: Colors.orange,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 15,
                                      ),),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      mainAxisAlignment: MainAxisAlignment.start,
                                      children: [
                                        RatingBar.builder(
                                          initialRating: products[index]
                                              .ratingCount!
                                              .toDouble(),
                                          minRating: 1,
                                          direction: Axis.horizontal,
                                          allowHalfRating: true,
                                          itemSize: 15.0,
                                          itemCount: 5,
                                          itemPadding:
                                          EdgeInsets.symmetric(horizontal: 4.0),
                                          itemBuilder: (context, _) =>
                                              Icon(
                                                Icons.star,
                                                color: Colors.amber,
                                              ),
                                          onRatingUpdate: (rating) {
                                            print(rating);
                                          },
                                        ),
                                        Text(products[index]
                                            .ratingCount!
                                            .toDouble()
                                            .toString()),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ),
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        );
      });
      }
    
      List<Tab> _tabs(List<CategoryModel> categoryModel) {
        List<Tab> tabs = [];
        for (CategoryModel category in categoryModel) {
          tabs.add(Tab(
            text: category.name,
          ));
        }
        return tabs;
      }

    وهذه كامل الملفات , ملف stream_products.dart

    
    import 'dart:async';
    import '../../common/api_service.dart';
    
    import '../../pages/contracts/contracts.dart';
    import '../../models/Product.dart';
    class StreamProductsBloc implements Disposable
    {
      List<ProductsModel>? products;
    
      final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast();
      final StreamController<int> _categoryController = StreamController<int>.broadcast();
    
      Stream<List<ProductsModel>> get productsStream => _productsController.stream;
    
      StreamSink<int> get fetchProducts => _categoryController.sink;
      Stream<int> get getProductsForCategoriescategory => _categoryController.stream;
    
      APIService? apiService;
    
      int categoryID = 0;
    
      StreamProductsBloc()
      {
        //this.categoryID = categoryID;
        this.products = [];
        apiService = APIService();
        _productsController.add(products!);
        _categoryController.add(this.categoryID);
        _categoryController.stream.listen(_fetchCategoriesFromApi);
      }
    
      Future<void> _fetchCategoriesFromApi(int category) async {
        this.products = await apiService!.getProductsForCategories(category);
        _productsController.add(this.products!);
      }
    
      @override
      void dispose(){
        _productsController.close();
        _categoryController.close();
      }
    }

    و ملف الواجهة ملف products_screen.dart 

    
    import 'package:bistore/providers/auth.dart';
    import 'package:bistore/services/wishlist_provider.dart';
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter_rating_bar/flutter_rating_bar.dart';
    import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
    import 'package:provider/provider.dart';
    import '../../models/init_model.dart';
    import '../../widgets/shimmer/shimmer_grid.dart';
    import '../../generated/l10n.dart';
    import '../../models/cart_model.dart';
    import '../products/single_product.dart';
    import '../../models/Product.dart';
    import '../../models/category.dart';
    import '../../utils/helper_api.dart';
    import '../../pages/home/stream_products.dart';
    
    class Products extends StatefulWidget {
      const Products({Key? key}) : super(key: key);
    
      @override
      _ProductsState createState() => _ProductsState();
    }
    
    class _ProductsState extends State<Products>
        with AutomaticKeepAliveClientMixin, TickerProviderStateMixin {
      @override
      bool get wantKeepAlive => true;
    
      HelperApi helperApi = new HelperApi();
      int currentIndex = 0;
      late TabController _tabController;
      var refreshKey = GlobalKey<RefreshIndicatorState>();
    
      StreamProductsBloc streamProductsBloc = StreamProductsBloc();
    
      late List<CategoryModel> productsCategories;
    
      @override
      void initState() {
        // ignore: todo
        // TODO: implement initState
        super.initState();
        HelperApi().fetchCategories(1);
      }
    
      @override
      void dispose() {
        // ignore: todo
        // TODO: implement dispose
        super.dispose();
        _tabController.dispose();
        streamProductsBloc.dispose();
      }
    
      @override
      // ignore: must_call_super
      Widget build(BuildContext context) {
        return FutureBuilder<List<CategoryModel>>(
          future: helperApi.fetchCategories(1),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                return Center(
                  child: Text('No Connection'),
                );
              case ConnectionState.waiting:
              case ConnectionState.active:
                return Scaffold(
                  body: Center(
                    child: CircularProgressIndicator(),
                  ),
                );
              case ConnectionState.done:
                if (snapshot.hasError) {
                  print(snapshot.error);
                } else {
                  if (!snapshot.hasData) {
                    print('Data Not Found');
                  } else {
                    this.productsCategories = snapshot.data;
                    streamProductsBloc.fetchProducts
                        .add(this.productsCategories[0].id!);
                    return _categories(snapshot.data, context);
                  }
                }
                break;
            }
            return Container();
          },
        );
      }
    
      Widget _categories(List<CategoryModel> categoryModel, BuildContext context) {
        _tabController = TabController(
          initialIndex: 0,
          length: categoryModel.length,
          vsync: this,
        );
        return Scaffold(
          appBar: AppBar(
            title: Text(S.of(context).products),
            bottom: TabBar(
              indicatorColor: Color(0XFF117182),
              indicatorWeight: 5,
              controller: _tabController,
              tabs: _tabs(categoryModel),
              isScrollable: true,
              onTap: (int index) {
                streamProductsBloc.fetchProducts
                    .add(this.productsCategories[index].id!);
              },
            ),
          ),
          body: Container(
            child: StreamBuilder(
              stream: streamProductsBloc.productsStream,
              builder: (context, AsyncSnapshot<List<ProductsModel>>? snapshot) {
                switch (snapshot!.connectionState) {
                  case ConnectionState.none:
                    // ignore: todo
                    // TODO: Handle this case.
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  case ConnectionState.waiting:
                    // ignore: todo
                    // TODO: Handle this case.
                    return ShimmerGrid();
                  case ConnectionState.done:
                  case ConnectionState.active:
                    // ignore: todo
                    // TODO: Handle this case.
                    if (snapshot.hasError) {
                      return Center(
                        child: ShimmerGrid(),
                      );
                    } else {
                      if (!snapshot.hasData) {
                        return ShimmerGrid();
                      } else {
                        return _drawProducts(snapshot.data!, context);
                      }
                    }
                }
              },
            ),
          ),
        );
      }
    
      Widget _drawProducts(List<ProductsModel> products, BuildContext context) {
        final cart = Provider.of<Cart>(context, listen: false);
        var initModel = Provider.of<InitModel>(context, listen: false,);
        var auth = Provider.of<AuthProvider>(context, listen: false);
        return Consumer<WishListProvider>(
            builder: (BuildContext context, wishListData, child) {
        return Container(
          padding: EdgeInsets.only(top: 24),
          child: Column(
            children: [
              Flexible(
                child: GridView.builder(
                  gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                      maxCrossAxisExtent: 200,
                      childAspectRatio: 1 / 2,
                      crossAxisSpacing: 20,
                      mainAxisSpacing: 20),
                  itemCount: products.length,
                  itemBuilder: (context, index) {
                    return Card(
                      clipBehavior: Clip.hardEdge,
                      elevation: 0.9,
                      child: AnimationConfiguration.staggeredList(
                        position: index,
                        duration: const Duration(milliseconds: 375),
                        child: SlideAnimation(
                          verticalOffset: 50.0,
                          child: FadeInAnimation(
                            child: Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: InkWell(
                                onTap: () {
                                  _gotoSingleProduct(products[index], context);
                                },
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                                  children: [
                                    Expanded(
                                      // ignore: unnecessary_null_comparison
                                        child: Stack(
                                          children: [
                                            (products[index].images![0].src != null)
                                                ? Image.network(
                                              products[index].images![0].src!,
                                              width:
                                              MediaQuery
                                                  .of(context)
                                                  .size
                                                  .width,
                                              height: MediaQuery
                                                  .of(context)
                                                  .size
                                                  .height,
                                              fit: BoxFit.cover,
                                            )
                                                : Image.asset(
                                              "assets/images/1.jpeg",
                                              width:
                                              MediaQuery
                                                  .of(context)
                                                  .size
                                                  .width,
                                              height: MediaQuery
                                                  .of(context)
                                                  .size
                                                  .height,
                                              fit: BoxFit.fill,
                                            ),
                                            Positioned.directional(
                                              textDirection: Directionality.of(
                                                  context),
                                              child: Container(
                                                margin: EdgeInsets.symmetric(
                                                    horizontal: 12.0,
                                                    vertical: 10.0),
                                                decoration: BoxDecoration(
                                                    color: Colors.grey[200],
                                                    borderRadius:
                                                    BorderRadius.circular(50.0)),
                                                child: IconButton(
                                                  icon: Icon(
                                                      Icons.favorite_outline),
                                                  onPressed: () {
                                                    //wishListData.getCount(products[index].id!, auth.id!);
                                                    wishListData.addNewWishList(
                                                        price: products[index]
                                                            .price!
                                                            .toString(),
                                                        product: products[index]
                                                            .name!,
                                                        image: products[index]
                                                            .images![0]
                                                            .src!,
                                                        productId: products[index]
                                                            .id,
                                                        userId: auth.id);
                                                    ScaffoldMessenger.of(context)
                                                        .showSnackBar(
                                                      SnackBar(
                                                        content: Text(
                                                          S
                                                              .of(context)
                                                              .add_product_to_wishlist,
                                                        ),
                                                        duration: Duration(
                                                            seconds: 2),
                                                      ),
                                                    );
                                                  },
                                                  iconSize: 20.0,
                                                ),
                                              ),
                                            )
                                          ],
                                        )
                                    ),
                                    Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: Text(
                                        products[index].name!.substring(0, 10),
                                        style: TextStyle(
                                          color: Colors.black,
                                          fontWeight: FontWeight.bold,
                                          fontSize: 18.0,
                                        ),
                                      ),
                                    ),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      mainAxisAlignment:
                                      MainAxisAlignment.spaceBetween,
                                      children: [
                                        Padding(
                                          padding: const EdgeInsets.all(8.0),
                                          child: Text(initModel.currency! +
                                              products[index].price!,
                                            style: TextStyle(
                                              color: Colors.black,
                                              fontSize: 15.0,
                                            ),
                                          ),
                                        ),
                                        IconButton(
                                          icon: Icon(
                                              Icons.add_shopping_cart_outlined),
                                          onPressed: () {
                                            //if(auth.status == Status.Authenticated){
                                            cart.addItem(
                                                products[index].id.toString(),
                                                10.0,
                                                products[index].name!.toString(),
                                                products[index].images![0].src!,
                                                1,
                                                products[index].id.toString());
                                            ScaffoldMessenger.of(context)
                                                .hideCurrentSnackBar();
                                            ScaffoldMessenger.of(context)
                                                .showSnackBar(
                                              SnackBar(
                                                content: Text(
                                                  S
                                                      .of(context)
                                                      .product_added_to_the_cart,
                                                ),
                                                duration: Duration(seconds: 2),
                                                action: SnackBarAction(
                                                  label: S
                                                      .of(context)
                                                      .undo,
                                                  onPressed: () {
                                                    cart.reomveSingleItem(
                                                        products[index]
                                                            .id
                                                            .toString());
                                                  },
                                                ),
                                              ),
                                            );
                                          },
                                        ),
                                      ],
                                    ),
                                    Text(products[index].stockStatus!,
                                      style: TextStyle(
                                        color: Colors.orange,
                                        fontWeight: FontWeight.bold,
                                        fontSize: 15,
                                      ),),
                                    Row(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      mainAxisAlignment: MainAxisAlignment.start,
                                      children: [
                                        RatingBar.builder(
                                          initialRating: products[index]
                                              .ratingCount!
                                              .toDouble(),
                                          minRating: 1,
                                          direction: Axis.horizontal,
                                          allowHalfRating: true,
                                          itemSize: 15.0,
                                          itemCount: 5,
                                          itemPadding:
                                          EdgeInsets.symmetric(horizontal: 4.0),
                                          itemBuilder: (context, _) =>
                                              Icon(
                                                Icons.star,
                                                color: Colors.amber,
                                              ),
                                          onRatingUpdate: (rating) {
                                            print(rating);
                                          },
                                        ),
                                        Text(products[index]
                                            .ratingCount!
                                            .toDouble()
                                            .toString()),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ),
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        );
      });
      }
    
      List<Tab> _tabs(List<CategoryModel> categoryModel) {
        List<Tab> tabs = [];
        for (CategoryModel category in categoryModel) {
          tabs.add(Tab(
            text: category.name,
          ));
        }
        return tabs;
      }
    
      void _gotoSingleProduct(
          ProductsModel singleProductModel, BuildContext context) {
        Navigator.push(
          context,
          MaterialPageRoute(
              builder: (context) => SingleProduct(singleProductModel)),
        );
      }
    }
    
    class ProductsList extends StatelessWidget {
      final List<ProductsModel> productsModel;
    
      ProductsList({Key? key, required this.productsModel}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: [
            Expanded(
              child: ListView.builder(
                scrollDirection: Axis.vertical,
                itemCount: productsModel.length,
                itemBuilder: (context, index) {
                  return Text('${productsModel[index].name}');
                },
              ),
            ),
          ],
        );
      }
    }

     

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

    • أعجبني 1
  3. حاولت كثيرا لكن للأسف لم تعمل، عندي بالصفحة الرئيسية تظهر ال categories 

    أريد عند الضغط على أي category تظهر ال products الخاصة فيه تحت في نفس الشاشة ( يعني ما في navigation ) حسب الصورة المرفقة

    ملاحظة / ال data جاية من API

     

    photo5470088920080430557.jpg

    • أعجبني 1
  4. بتاريخ 4 دقائق مضت قال بلال زيادة:

    هنا الخطأ يخبرك أنه حقل id يجب أن يحتوي على قيمة  وبذلك لا يمكن ان يكون فارغ و يجب أن يكون حقل id عبارة عن Auto Increment بحيث يتم تعبئته تلقائياً , حاول رجاء تغيير الحقل id و جعله auto incement. 

    شكرا جدا، تم حل المشكلة

  5. صحيح،شكرا جدا، أعتذر، قمت بتغييرها ونسيت إرجاعها

     

     

    four.png

    بتاريخ 33 دقائق مضت قال عبود سمير:

    أعتقد أن قمية APP_DEBUG الحالية لديك هي false لتتحصل على معلومات أكثر عن الأخطاء يجب أن تكون true 

    ..

    بتاريخ 33 دقائق مضت قال عبود سمير:

    أعتقد أن قمية APP_DEBUG الحالية لديك هي false لتتحصل على معلومات أكثر عن الأخطاء يجب أن تكون true 

    الآن ما هي المشكلة؟ مع أنها كانت تعمل بشكل تمام عندما كانت تعمل على ال local

    • أعجبني 1
  6. بتاريخ 13 دقائق مضت قال عبود سمير:

    هل بإمكانك توضيح محتوى ملف الإعدادات، لأنه لحد الساعة بهذه المعطيات لا يُمكن إيجاد سبب المشكلة.

    هل لديك مسار يجلب بيانات من قاعدة البيانات يُمكنك تجربته للتأكد من أن الطريقة get تعمل عند جلب بيانات و للتأكد من الإتصال يعمل 

    الطريقة GET تعمل بشكل سليم ( الاتصال بقاعدة البيانات تمام )

    ما المقصود ب (محتوى ملف الإعدادات)؟

    • أعجبني 1
  7. بتاريخ 2 دقائق مضت قال عبود سمير:

    ماهي نتيجة الطلب الذي تُرسله لأن الخطأ 500 ليس متعلق بشيء محدد، حتى نستطيع المساعدة يُرجى تفصيل و شرح المشكلة بشكل أكبر

    هذه أول صورة تقوم بإرجاع الvalidation يعني يتم الدخول إلى ال route

    one.png

    ها هي الرسالة التي تظهر، أتوقع أن المشكلة تبدأ عند بداية التعامل مع قاعدة البيانات حتى يتم حفظها في قاعدة البيانات

    two.png

    باشا ملف ال .env

    قيمة ال APP_KEY 

    ايش المفروض يكون فيها؟

    ممكن هذه المعلومات تفيدك كمان

    three.png

  8. بتاريخ 2 دقائق مضت قال عبود سمير:

    في ملف env. قم بتفعيل APP_DEBUG مؤقتا حتى تتحصل على الخطأ الفعلي الذي يؤدي إلى المشكلة 

     

    مفعل بالفعل، أنا أتحدث عن نوع الطلب من نوع POST من برنامج postman مثلا ,وليس من المتصفح

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

    يمكنك فتح المسار التالي 

    
    storage/logs/

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

    
    500 Internal Server Error

    يكون خطأ داخلي ولا يمكن تحديده إلا بالرجوع إلى ملفات logs.

    الملف الوحيد الموجود ضمن المسار هو (laravel.log) ويحتوي على أكثر من 500 سطر، هل هذا طبيعي؟

    تعديل/ 5000 سطر

    وها هو الملف / https://drive.google.com/file/d/1iuT1e9sAoTuB_9QM87T4W3uGwErSYhIE/view?usp=sharing

  10. بتاريخ 22 دقائق مضت قال Sam Ahw:

    المشكلة ليست في ملف .env طالما قمت بكتابة اسم قاعدة البيانات ومعلومات الاتصال بالشكل الصحيح:

    
    DB_CONNECTION=mysql
    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=hello // DB_name
    DB_USERNAME=root // DB_username
    DB_PASSWORD= //DB_password

    تأكد من أن قاعدة البيانات موجودة بنفس الاسم على الاستضافة ومن اسم المستخدم وكلمة المرور للوصول إليها. أما ماتبقى من ملف .env فهو صحيح ولا يتعلّق بالاتصال بقاعدة البيانات.

    كما يمكنك تشغيل app debug لإمكانية الحصول على معلومات إضافية عن الأخطاء التي تحدث.

    شكرا على اهتمامك، تم حل المشكلة، كان لازم أضع ال password بين ""

    لكن ظهرت مشكلة أخرى ( وهو عدم قدرتي على إرسال طلب من نوع POST )، يظهر لي Server Error

  11. بتاريخ منذ ساعة مضت قال Sam Ahw:

    الخطأ Server Error 500 هو خطأ عام وقد تؤدي عدة أسباب لذلك لا يمكننا معرفة ماهو السبب بالتحديد من رمز الخطأ.

    لكن بما أن المشكلة في المسارات التي تتعامل مع قاعدة البيانات، تأكد من الاتصال مع قاعدة البيانات بشكل صحيح ومن أن قاعدة البيانات موجودة على الاستضافة ويمكن جلب معلومات منها.

    ولنستطيع مساعدتك بشكل أفضل، يجب على الأقل ذكر تفاصيل لغة البرمجة ونوع قاعدة البيانات وأجزاء الكود التي تسبب المشكلة.

    laravel + mysql

    أعتقد أن المشكلة في ملف .env

    APP_NAME=AlJoode
    APP_ENV=local
    APP_KEY=
    APP_DEBUG=false
    APP_URL=http://aljode.com
    
    LOG_CHANNEL=stack
    LOG_LEVEL=debug
    
    DB_CONNECTION=mysql
    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=hello // DB_name
    DB_USERNAME=root // DB_username
    DB_PASSWORD= //DB_password
    
    BROADCAST_DRIVER=log
    CACHE_DRIVER=file
    QUEUE_CONNECTION=sync
    SESSION_DRIVER=file
    SESSION_LIFETIME=120
    
    MEMCACHED_HOST=localhost
    
    REDIS_HOST=localhost
    REDIS_PASSWORD=null
    REDIS_PORT=6379
    
    MAIL_MAILER=smtp
    MAIL_HOST=mailhog
    MAIL_PORT=1025
    MAIL_USERNAME=null
    MAIL_PASSWORD=null
    MAIL_ENCRYPTION=null
    MAIL_FROM_ADDRESS=null
    MAIL_FROM_NAME="${APP_NAME}"
    
    AWS_ACCESS_KEY_ID=
    AWS_SECRET_ACCESS_KEY=
    AWS_DEFAULT_REGION=us-east-1
    AWS_BUCKET=
    
    PUSHER_APP_ID=
    PUSHER_APP_KEY=
    PUSHER_APP_SECRET=
    PUSHER_APP_CLUSTER=mt1
    
    MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
    MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

     

  12. عندي موقع قديم يحتوي على products تابعة ل categories، أريد عندما يضغط المستخدم على product في الموقع الجديد وليس القديم ( باختصار / يعني أريد عمل redirect  كيف؟ )

    وايضا من باب التوضيح / 

    أريد عندما يدخل المستخدم على الموقع القديم ويعمل له إعادة تحويل 
    يتغير الرابط من ca-123123.html  إلى cat=123123

    • أعجبني 1
  13. أستخدم مكتبة جاهزة لتعدد اللغات ( وبالتالي عند اختيا راللغة العربية، يتم تغير الاتجاه إلى RTL بشكل تلقائي )،

    المشكلة أن هناك جزء لا يتغير اتجاهه ويبقى كأن اللغة انجليزية ( ماذا يمكن أن تكون المشكلة )؟

    • أعجبني 1
  14. <select name="food">
      @foreach ($items as $item)
      @if ($loop->last)
      @isset($selected)
      <option selected>{{$selected}}</option>
      @endisset
      @endif
      @endforeach
    </select>

    الآن، عند اختيار option والضغط على submit شغالة تمام، لكن عند الضغط على submit بدون اختيار option ( يكون ال option ال defualt أول option )، تظهر رسالة خطأ ، لأنه أنا ما عملت select لأي option ف كيف يمكن حل هذه المشكلة؟

    باختصار ( أريد عن تشغيل ال form لأول مرة تكون قيمة ال option الأول select )

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