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

Flutter Dev

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

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

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

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

    2

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

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

    اقوم بعرض مجموعة من الصور للمستخدم تم تخزينها مسبقا على قاعدة البيانات من خلال listview  بالاضافة الى استعمال المكتبة :

    https://pub.dev/packages/wechat_assets_picker

    من خلالها اقوم باضافة المزيد من الصور بجانب الصور التي احصل عليها من قاعدة البيانات الى نفس listview  السابقة.

    المشكله الان لما اذهب الى اختيار الصور واختار صور عدد (2) او (3) على سبيل المثال من الصور على الهاتف بعد الضغط على ادراج انا احصل على صوره واحده فقط وهيا اول صوره تم تحديدها من اصل (2) التي تم اختيارهم او (3) ولو رجعت لختيار مجموعة مختلفه من الصور رح اجد ان الصور تم تحديدها فعلا مسبقاً ولكن لم يتم سحبها الى listview ولو قمت بضغط على ادراج من جديد سوف يتم استكمال العملية وادراج الصوره التاليه التي سبق وتم تحديدها سابقاً.

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

    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    import 'dart:async';
    import 'dart:convert';
    import 'dart:io';
    import 'package:wechat_assets_picker/wechat_assets_picker.dart';
    
    
    
    void main() {
      runApp(
        MyApp(),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: UpdateItem(),
        );
      }
    }
    
    class UpdateItem extends StatefulWidget {
    
      @override
      _update_profiletttState createState() => new _update_profiletttState();
    }
    
    class _update_profiletttState extends State<UpdateItem> {
    
      @override
      void initState() {
        super.initState();
        init();
      }
    
      void init() {
    
        GetImage().then((value) {
          setState(() {
            users.addAll(value);
            filteredUsers = users;
    
          });
        });
      }
    
      List<DataImage> users = [];
      List<DataImage> filteredUsers = [];
    
    
    
      final _formKeys = GlobalKey<FormState>();
    
    
     var  imagesCounter = 0;
    
      String api;
      Future<List<DataImage>> GetImage() async {
        api = '*****************************' ;
        var response = await http.post(Uri.parse(api));
        if (response.statusCode == 200) {
          final items = json.decode(response.body).cast<Map<String, dynamic>>();
          List<DataImage> listOfFruits = items.map<DataImage>((json) {
            return DataImage.fromJson(json);
          }).toList();
          imagesCounter = listOfFruits.length; 
          return listOfFruits;
        }
    
      }
    
      List<AssetEntity> assets = <AssetEntity>[];
    
      @override
      Widget build(BuildContext context) {
    
    
        return  MaterialApp(
          home: Scaffold(
    
            body: Form(
                key: _formKeys,
                child:  Center(
                  child:   ListView(
                    children: <Widget>[
    
                      Card(
                        child: new Column(
                          children: <Widget>[
                            Container(
                              child: Center(
                                child: Column(
                                  children: <Widget>[
                                    Padding(
                                      padding: EdgeInsets.all(0),
                                      child: SingleChildScrollView(
                                        child: SizedBox(
                                          child: Column(
                                            //  mainAxisAlignment: MainAxisAlignment.start,
                                            //   crossAxisAlignment: CrossAxisAlignment.start,
                                            children: <Widget>[
    
                                              Column(
                                                children: <Widget>[
                                                  AnimatedContainer(
                                                    duration: kThemeAnimationDuration,
                                                    curve: Curves.easeInOut,
                                                    width: MediaQuery.of(context).size.width,
                                                    height: filteredUsers.isNotEmpty ? 100.0 : 0.0,
                                                    child: ListView.builder(
                                                        physics:  BouncingScrollPhysics(),
    
                                                        scrollDirection: Axis.horizontal,
                                                        itemCount: filteredUsers.length + 1  ,
                                                        itemBuilder: (BuildContext context, int index) {
    
                                                          if (index < filteredUsers.length) {
                                                            return Container(
                                                              margin: const EdgeInsets.symmetric(
                                                                  horizontal: 0.5, vertical: 6.0),
                                                              child: AspectRatio(
                                                                aspectRatio: 1.0,
                                                                child: Stack(
                                                                  children: <Widget>[
    
                                                                    filteredUsers[index].isLocal ?
    
    
                                                                    Image(
                                                                      image: AssetEntityImageProvider(
                                                                        assets.elementAt(index-imagesCounter) ,
                                                                        isOriginal: false,
                                                                      ),
                                                                      fit: BoxFit.cover,
                                                                    )
    
    
                                                                        : Image.network(
                                                                      filteredUsers[index].ImageURL.toString(),
                                                                      width: double.infinity,
                                                                      height: 400,
                                                                      fit: BoxFit.cover,
                                                                    ),
    
    
    
    
                                                                  ],
    
                                                                ),
                                                              ),
                                                            );
                                                          }
                                                          else {
    
                                                            return
                                                              IconButton(
                                                                icon: Icon(Icons.add,size: 50,),
                                                                onPressed: ()  async {
    
                                                                  final List<AssetEntity> result = await AssetPicker.pickAssets(context,
                                                                     // maxAssets: 4,
                                                                      pathThumbSize: 84,
                                                                      gridCount: 4,
                                                                      selectedAssets: assets,
                                                                      maxAssets: 4 - imagesCounter,
                                                                      //we use this for languge
                                                                      textDelegate: EnglishTextDelegate());
    
                                                                  if (result != null) {
    
                                                                    setState(() {
    
                                                                      assets = List<AssetEntity>.from(result);
    
                                                                      filteredUsers.add(DataImage( isLocal: true));
    
    
                                                                    });
                                                                  }
    
    
    
                                                                },
                                                              );
    
                                                          }
    
                                                        }
    
                                                      //itemBuilder: assetItemBuilder,
                                                    ),
                                                  )
    
                                                ],
                                              ),
    
                                            ],
                                          ),
                                        ),
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ),
                            /*     Card(
                                    child: showImage(),
                                  ),*/
    
                          ],
                        ),
                      ),
    
    
                    ],
                  ),
                )),
          ),
        );
      }
    
    
    
    }
    class DataImage {
    
      bool isLocal;
      String ImageURL;
    
    
      DataImage(
          { this.ImageURL, this.isLocal = false});
    
      factory DataImage.fromJson(Map<String, dynamic> json) {
        return DataImage(
    
          ImageURL: json['image'].toString(),
    
        );
      }
    
      Map<String, dynamic> toJson() => {
    
        'ImageURL': ImageURL,
        'isLocal': isLocal,
    
      };
    
    
    }

    ياليت اذا احد لديه فكره عن سبب المشكله وكيفية حلها يفيدنا بارك الله فيكم

  2. import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    import 'dart:async';
    import 'dart:convert';
    import 'dart:io';
    import 'package:wechat_assets_picker/wechat_assets_picker.dart';
    
    
    
    void main() {
      runApp(
        MyApp(),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: UpdateItem(),
        );
      }
    }
    
    class UpdateItem extends StatefulWidget {
    
      @override
      _update_profiletttState createState() => new _update_profiletttState();
    }
    
    class _update_profiletttState extends State<UpdateItem> {
    
      @override
      void initState() {
        super.initState();
        init();
      }
    
      void init() {
    
        GetImage().then((value) {
          setState(() {
            users.addAll(value);
            filteredUsers = users;
    
          });
        });
      }
    
      List<DataImage> users = [];
      List<DataImage> filteredUsers = [];
    
    
    
      final _formKeys = GlobalKey<FormState>();
    
    
     var  imagesCounter = 0;
    
      String api;
      Future<List<DataImage>> GetImage() async {
        api = '*************************' ;
        var response = await http.post(Uri.parse(api));
        if (response.statusCode == 200) {
          final items = json.decode(response.body).cast<Map<String, dynamic>>();
          List<DataImage> listOfFruits = items.map<DataImage>((json) {
            return DataImage.fromJson(json);
          }).toList();
          imagesCounter = listOfFruits.length; // هنا
          return listOfFruits;
        }
    
      }
    
      List<AssetEntity> assets = <AssetEntity>[];
    
      @override
      Widget build(BuildContext context) {
    
    
        return  MaterialApp(
          home: Scaffold(
    
            body: Form(
                key: _formKeys,
                child:  Center(
                  child:   ListView(
                    children: <Widget>[
    
                      Card(
                        child: new Column(
                          children: <Widget>[
                            Container(
                              child: Center(
                                child: Column(
                                  children: <Widget>[
                                    Padding(
                                      padding: EdgeInsets.all(0),
                                      child: SingleChildScrollView(
                                        child: SizedBox(
                                          child: Column(
                                            //  mainAxisAlignment: MainAxisAlignment.start,
                                            //   crossAxisAlignment: CrossAxisAlignment.start,
                                            children: <Widget>[
    
                                              Column(
                                                children: <Widget>[
                                                  AnimatedContainer(
                                                    duration: kThemeAnimationDuration,
                                                    curve: Curves.easeInOut,
                                                    width: MediaQuery.of(context).size.width,
                                                    height: filteredUsers.isNotEmpty ? 100.0 : 0.0,
                                                    child: ListView.builder(
                                                        physics:  BouncingScrollPhysics(),
    
                                                        scrollDirection: Axis.horizontal,
                                                        itemCount: filteredUsers.length + 1  ,
                                                        itemBuilder: (BuildContext context, int index) {
    
                                                          if (index < filteredUsers.length) {
                                                            return Container(
                                                              margin: const EdgeInsets.symmetric(
                                                                  horizontal: 0.5, vertical: 6.0),
                                                              child: AspectRatio(
                                                                aspectRatio: 1.0,
                                                                child: Stack(
                                                                  children: <Widget>[
    
                                                                    filteredUsers[index].isLocal ?
    
    
                                                                    Image(
                                                                      image: AssetEntityImageProvider(
                                                                        assets.elementAt(index-imagesCounter) ,// تم تعديل هنا ايضا
                                                                        isOriginal: false,
                                                                      ),
                                                                      fit: BoxFit.cover,
                                                                    )
    
    
                                                                        : Image.network(
                                                                      filteredUsers[index].ImageURL.toString(),
                                                                      width: double.infinity,
                                                                      height: 400,
                                                                      fit: BoxFit.cover,
                                                                    ),
    
    
    
    
                                                                  ],
    
                                                                ),
                                                              ),
                                                            );
                                                          }
                                                          else {
    
                                                            return
                                                              IconButton(
                                                                icon: Icon(Icons.add,size: 50,),
                                                                onPressed: ()  async {
    
                                                                  final List<AssetEntity> result = await AssetPicker.pickAssets(context,
                                                                     // maxAssets: 4,
                                                                      pathThumbSize: 84,
                                                                      gridCount: 4,
                                                                      selectedAssets: assets,
                                                                      maxAssets: 4 - imagesCounter,
                                                                      //we use this for languge
                                                                      textDelegate: EnglishTextDelegate());
    
                                                                  if (result != null) {
                                                                    setState(() {
    
                                                                      assets = List<AssetEntity>.from(result);
    
                                                                      filteredUsers.add(DataImage(  isLocal: true));
    
    
                                                                    });
                                                                  }
    
    
    
                                                                },
                                                              );
    
                                                          }
    
                                                        }
    
                                                      //itemBuilder: assetItemBuilder,
                                                    ),
                                                  )
    
                                                ],
                                              ),
    
                                            ],
                                          ),
                                        ),
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ),
                            /*     Card(
                                    child: showImage(),
                                  ),*/
    
                          ],
                        ),
                      ),
    
    
                    ],
                  ),
                )),
          ),
        );
      }
    
    
    
    }
    class DataImage {
    
      bool isLocal;
      String ImageURL;
    
    
      DataImage(
          { this.ImageURL, this.isLocal = false});
    
      factory DataImage.fromJson(Map<String, dynamic> json) {
        return DataImage(
    
          ImageURL: json['image'].toString(),
    
        );
      }
    
      Map<String, dynamic> toJson() => {
    
        'ImageURL': ImageURL,
        'isLocal': isLocal,
    
      };
    
    
    }

     

     

    كل الشكر لك اخي الكريم 

  3. بتاريخ 14 ساعات قال Wael Aljamal:

    كيف نتحكم بعدد الصور؟

    قم بتعريف متغير عام،

    يحوي قيمة ابتدائية 0.

    يتم تحديثه أولا بعدد الصور التي تأتي من قاعدة البيانات..

    
    imagesCounter = 0
    
    if (response.statusCode == 200) {
          final items = json.decode(response.body).cast<Map<String, dynamic>>();
          List<DataImage> listOfFruits = items.map<DataImage>((json) {
            return DataImage.fromJson(json);
          }).toList();
          
            imagesCounter = listOfFruits.length; // هنا
            
          return listOfFruits;
    }

    ثم نمرر للدالة التي تسمح للمستخدم بجلب الصور من الاستديو عدد الصور التي من الممكن إضافتها، وهي 4 ناقص التي تم تحميلها فعليا

    
    maxAssets: 4 - imagesCounter,

    هكذا يكون لنا متغير عام يضبط عدد الصور.

     

    مرحبا اخي الكريم

    شاكر لك ردك كقير

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

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

    لاحظ أنك تضيف صورة جديدة أيضا تأكد من تحديد طول قائمة البيانات. على سبيل المثال ، إذا كنت تستخدم ListView.builder ، فقم بإعطاء قيمة مناسبة للسمة itemCount.

    اهلا بك اخوي 

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

    • أعجبني 1
  5. لدي ListView اجلب اليها مجموعة صور من قاعدة البيانات تم تخزينها مسابقا واعرضهم من خلال ListView . 

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

    https://pub.dev/packages/wechat_assets_picker

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

    The following RangeError was thrown building:
    RangeError (index): Invalid value: Only valid value is 0: 1
    
    When the exception was thrown, this was the stack: 
    #0      List.[] (dart:core-patch/growable_array.dart:254:60)
    #1      List.elementAt (dart:core-patch/growable_array.dart:476:16)
    #2      _update_profiletttState.build.<anonymous closure> (package:flutter_application_1/testpage.dart:178:76)
    #3      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:456:22)
    #4      SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1214:28)
    #5      SliverMultiBoxAdaptorElement.performRebuild.processElement (package:flutter/src/widgets/sliver.dart:1147:67)
    #6      Iterable.forEach (dart:core/iterable.dart:279:35)
    #7      SliverMultiBoxAdaptorElement.performRebuild (package:flutter/src/widgets/sliver.dart:1191:24)

    وهذا صوره توضح المشكله :

    ولكن لو قمت باختيار عدد 2 من الصور او اكثر المشكله هذا لا تحدث .

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

    ايضا لو قمت باختيار مثلا 4 صور لن يتم جلب سوى صوره واحده فقط للقائمة.

    ياليت اذا احد لديه فكره عن حل للمشكله او سبق ان مر بمثلها يساعدنا في حلها ولكم جزيل الشكر.

    مرفق الصفحة كامل :

    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    import 'dart:async';
    import 'dart:convert';
    import 'dart:io';
    import 'package:wechat_assets_picker/wechat_assets_picker.dart';
    
    
    
    void main() {
      runApp(
        MyApp(),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: UpdateItem(),
        );
      }
    }
    
    class UpdateItem extends StatefulWidget {
    
      @override
      _update_profiletttState createState() => new _update_profiletttState();
    }
    
    class _update_profiletttState extends State<UpdateItem> {
    
      @override
      void initState() {
        super.initState();
        init();
      }
    
      void init() {
    
        GetImage().then((value) {
          setState(() {
            users.addAll(value);
            filteredUsers = users;
    
          });
        });
      }
    
      List<DataImage> users = [];
      List<DataImage> filteredUsers = [];
    
    
    
      final _formKeys = GlobalKey<FormState>();
    
    
    
    
      String api;
      Future<List<DataImage>> GetImage() async {
        api = 'https://***************.php' ;
        var response = await http.post(Uri.parse(api));
        if (response.statusCode == 200) {
          final items = json.decode(response.body).cast<Map<String, dynamic>>();
          List<DataImage> listOfFruits = items.map<DataImage>((json) {
            return DataImage.fromJson(json);
          }).toList();
          return listOfFruits;
        }
    
      }
      
      List<AssetEntity> assets = <AssetEntity>[];
      
      @override
      Widget build(BuildContext context) {
    
    
        return  MaterialApp(
          home: Scaffold(
    
            body: Form(
                key: _formKeys,
                child:  Center(
                  child:   ListView(
                    children: <Widget>[
    
                      Card(
                        child: new Column(
                          children: <Widget>[
                            Container(
                              child: Center(
                                child: Column(
                                  children: <Widget>[
                                    Padding(
                                      padding: EdgeInsets.all(0),
                                      child: SingleChildScrollView(
                                        child: SizedBox(
                                          child: Column(
                                            //  mainAxisAlignment: MainAxisAlignment.start,
                                            //   crossAxisAlignment: CrossAxisAlignment.start,
                                            children: <Widget>[
    
                                              Column(
                                                children: <Widget>[
                                                  AnimatedContainer(
                                                    duration: kThemeAnimationDuration,
                                                    curve: Curves.easeInOut,
                                                    width: MediaQuery.of(context).size.width,
                                                    height: filteredUsers.isNotEmpty ? 100.0 : 0.0,
                                                    child: ListView.builder(
                                                        physics:  BouncingScrollPhysics(),
    
                                                        scrollDirection: Axis.horizontal,
                                                        itemCount: filteredUsers.length + 1  ,
                                                        itemBuilder: (BuildContext context, int index) {
    
                                                          if (index < filteredUsers.length) {
                                                            return Container(
                                                              margin: const EdgeInsets.symmetric(
                                                                  horizontal: 0.5, vertical: 6.0),
                                                              child: AspectRatio(
                                                                aspectRatio: 1.0,
                                                                child: Stack(
                                                                  children: <Widget>[
    
                                                                    filteredUsers[index].isLocal ?
                                                                        
    
                                                                    Image(
                                                                      image: AssetEntityImageProvider(
    
                                                                        assets.elementAt(index) ,
                                                                        isOriginal: false,
                                                                      ),
                                                                      fit: BoxFit.cover,
                                                                    )
    
    
                                                                        : Image.network(
                                                                      filteredUsers[index].ImageURL.toString(),
                                                                      width: double.infinity,
                                                                      height: 400,
                                                                      fit: BoxFit.cover,
                                                                    ),
    
    
    
    
                                                                  ],
    
                                                                ),
                                                              ),
                                                            );
                                                          }
                                                          else {
    
                                                            return
                                                              IconButton(
                                                                icon: Icon(Icons.add,size: 50,),
                                                                onPressed: ()  async {
    
                                                                  final List<AssetEntity> result = await AssetPicker.pickAssets(context,
                                                                      maxAssets: 4,
                                                                      pathThumbSize: 84,
                                                                      gridCount: 4,
                                                                      selectedAssets: assets,
    
                                                                      //we use this for languge
                                                                      textDelegate: EnglishTextDelegate());
    
                                                                  if (result != null) {
                                                                    setState(() {
    
                                                                      assets = List<AssetEntity>.from(result);
    
                                                                      filteredUsers.add(DataImage(  isLocal: true));
    
    
                                                                    });
                                                                  }
    
    
    
                                                                },
                                                              );
    
                                                          }
    
                                                        }
    
                                                      //itemBuilder: assetItemBuilder,
                                                    ),
                                                  )
    
                                                ],
                                              ),
    
                                            ],
                                          ),
                                        ),
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ),
                            /*     Card(
                                    child: showImage(),
                                  ),*/
    
                          ],
                        ),
                      ),
    
    
                    ],
                  ),
                )),
          ),
        );
      }
    
    
    
    }
    class DataImage {
    
      bool isLocal;
      String ImageURL;
    
    
      DataImage(
          { this.ImageURL, this.isLocal = false});
    
      factory DataImage.fromJson(Map<String, dynamic> json) {
        return DataImage(
    
          ImageURL: json['image'].toString(),
    
        );
      }
    
      Map<String, dynamic> toJson() => {
    
        'ImageURL': ImageURL,
        'isLocal': isLocal,
    
      };
    
    
    }

     

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

    هل حاوت استخدام حزمة dio لكي تتمكن من رفع الصور بشكل سليم , فهي لديها تعامل رائع في رفع الصور 

    
    Future<bool> uploadImage(filePath, String image) async {
        final url = Config.url + Config.uploadImage;
    
        String fileName = filePath.path.split("/").last;
        var data = FormData.fromMap({
          "image": await MultipartFile.fromFile(
            filePath.path,
            filename: fileName,
          ),
          "email": email,
        });
        Dio dio = new Dio();
        var res = await dio.post(url, data: data, options: new Options(headers: {
          HttpHeaders.authorizationHeader: 'Bearer $token',
          HttpHeaders.contentTypeHeader: 'application/json'
        }));
        
        return res.statusCode == 200 ? true : false;
      }

    بحيث يمكنك تمرير مسار الصورة ليتم رفع الصورة إلى المسار المحدد في api و اسم الصورة إذا أردت حفظ اسم الصورة بداخل قاعدة البيانات. 

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

    ياليت لو تكرمت تضع الكود كامل مع كود php الخاص فيها

    • أعجبني 1
  7. تحيه طيبه للجميع

    اقوم بستعمال المكتبة التاليه :

    https://pub.dev/packages/wechat_assets_picker

    لتمكين المستخدم من اختيار مجموعة من الصور وبعدها يتم رفع هذا الصور الى قاعدة البيانات على السيرفر بواسطة  mysql + php  +http

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

    الصفحه كامل كالتالي:

    import 'dart:io';
    import 'package:flutter/material.dart';
    import 'dart:convert';
    import 'package:http/http.dart' as http;
    import 'package:wechat_assets_picker/wechat_assets_picker.dart';
    
    
    void main() {
      runApp(
       MyApp(),
    
      );
    }
    
    class MyApp extends StatelessWidget {
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: UploadImageDemo(),
        );
      }
    }
    
    class UploadImageDemo extends StatefulWidget {
    
      @override
      UploadImageDemoState createState() => UploadImageDemoState();
    }
    
    
    class UploadImageDemoState extends State<UploadImageDemo> {
    
      List<AssetEntity> assets = <AssetEntity>[];
      Future<void> selectAssets() async {
        final List<AssetEntity> result = await AssetPicker.pickAssets(
          context,
          maxAssets: 4,
          pathThumbSize: 84,
          gridCount: 4,
          selectedAssets: assets,
    
          requestType: RequestType.common,
        );
        if (result != null) {
          setState(() {
            assets = List<AssetEntity>.from(result);
    
          });
    
        }
      }
    
    
      Widget imageWidget(int index) {
        return Positioned.fill(
          child: Image(
            image: AssetEntityImageProvider(
              assets.elementAt(index),
              isOriginal: false,
            ),
            fit: BoxFit.cover,
          ),
        );
      }
    
    
      String base64Image;
      static final String UplodURL ='https://XXXXXXXXXXXXXXXXX.php';
    
    
    void SaveDate() async {
    
      for (int i = 0; i < assets.length; i++) {
        if (assets[i].runtimeType == String) {
    
          final bytes = File(assets[i].toString()).readAsBytesSync();
          base64Image = base64Encode(bytes);
    
          var response = await http.post(Uri.parse(UplodURL), body: {
            "image": base64Image,
    
          });
    
          if (response.statusCode == 200) {
    setState(() {
      print(response.statusCode);
    });
          } else {}
        }
    
      }
    
    }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
    
            actions: <Widget>[
              IconButton(
                icon: Icon(
                  Icons.save,
                  color: Colors.black,
                ),
                onPressed: () {
                  SaveDate();
    
                },
              ),
              IconButton(
                icon: Icon(
                  Icons.add,
                  color: Colors.black,
                ),
                onPressed: () {
                  selectAssets();
    
                },
              ),
            ],
          ),
          body: Column(
            children: <Widget>[
    
    
              AnimatedContainer(
                duration: kThemeAnimationDuration,
                curve: Curves.easeInOut,
                width: MediaQuery.of(context).size.width,
                height: assets.isNotEmpty ? 100.0 : 0.0,
                decoration: BoxDecoration(
                  color: Theme.of(context).backgroundColor,
                ),
                child: ListView.builder(
                    physics: const BouncingScrollPhysics(),
                    scrollDirection: Axis.horizontal,
                    itemCount: assets.length,
                    itemBuilder: (BuildContext context, int index) {
                      return Container(
                        margin: const EdgeInsets.symmetric(horizontal: 5.0, vertical: 10.0),
                        child: AspectRatio(
                          aspectRatio: 1.0,
                          child: ClipRRect(
                            borderRadius: BorderRadius.circular(5.0),
                            child: Stack(
                              children: <Widget>[
                                imageWidget(index),
    
    
                              ],
                            ),
                          ),
                        ),
                      );
    
    
                    }
               
                ),
              ),
    
    
    
            ],
          ),
        );
      }
    }

     

    اما صفحة php كالتالي:

    <?php
    		$image = $_POST['image'];
    
    
    	include 'con.php';
    
    	$path = "img/" . uniqid() . ".png";
    
    		$actualpath = "https://***********/$path";
    
    
    $sql = "INSERT INTO  testtable (image) VALUES (?)";		
    
    $stmt = $con->prepare($sql); 
    
    $stmt->bind_param("s",$actualpath);
    
    $stmt->execute();
    
    $result = $stmt->get_result();
    		
    
    
    			file_put_contents($path,base64_decode($image));
    
    
    	
    
    	$stmt->close();
    
    ?> 

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

    المشكله  في كود حفظ الصور ()SaveDate في فلاتر ياليت اذا احد لديه فكره او معرفة بالمشكله يفيدنا لو تكرمتو

     

    • أعجبني 1
  8. بتاريخ 53 دقائق مضت قال Wael Aljamal:
    
    itemCount: _imageFileList !=null ?
    	_imageFileList.length.clamp(0, 4) : _imageFileList.length.clamp(0, _imageFileList.length),

     

    من المفترض ان يقوم مطور الحزمة باضافة هذا الميزة ولا الحزمة ستعاني من مشكله + نقص لخصائص اساسيه بها 

    كل الشكر لك اخي الكريم واعتذر على الاطاله 

    • أعجبني 1
  9. بتاريخ 7 دقائق مضت قال Wael Aljamal:

    أنت تعيد 0، وهذا يعدل المتغير itemCount إلى 0 لذلك يسمح للمستخدم بإعادة التحديد

    ماذا تفعل الطريقة clamp؟

    جرب: لست متأكداً

    
    itemCount: _imageFileList !=null ?  _imageFileList.length.clamp(0, 4) : _imageFileList.length,

    أو استخدم الدالة take لأخذ أول x عنصر من القائمة

    
    _imageFileList = 
    		_imageFileList != null ? 
    		(_imageFileList.length > 4 ? _imageFileList.take(4) : _imageFileList),
    
    itemCount: _imageFileList.length,

     

     الـ clamp تحديد حجم القائمة بمعنى لن يظهر شي اكثر من اربع عناصر لدي 

     

    بنسبة الى هذا الحل :

    itemCount: _imageFileList !=null ?  _imageFileList.length.clamp(0, 4) : _imageFileList.length,

    يحصل الخطاء التالي:

    ======== Exception caught by widgets library =======================================================
    The following NoSuchMethodError was thrown building FutureBuilder<void>(dirty, state: _FutureBuilderState<void>#85b48):
    The getter 'length' was called on null.
    Receiver: null
    Tried calling: length

    اما هذا السطر اين ممكن استعمله لو تكرمت لنني قمت باكثر بوضعه اكثر من موقع ولكن يكون الموقع خطاء

    _imageFileList = 
    		_imageFileList != null ? 
    		(_imageFileList.length > 4 ? _imageFileList.take(4) : _imageFileList),

     

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

    الخطأ:

    
     Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null.
                                                        ^^^^^^^^^^^^^^^^^^^^   ^^^^

    القائمة الابتدائية تكون فارغة null لذلك لايمكن استدعاء دوال عليها ، الكائن لم يتم بناءه

    الحل:

    
    if (_imageFileList != null && _imageFileList.length == MAX_PHOTO_UPLOAD) {
        ^^^^^^^^^^^^^^^^^^^^^^

    نختبر القائمة إن كانت موجودة.

    للتخلص من مشكلة null علينا استخدام الدالة البانية في أول الصفحة

    
    List<XFile> _imageFileList = List<XFile>();

     

    اهلا بك اخي انا قمت بتنفيذ ما ذكرته انت وذهب الخطاء فعلا المشكله فقط هيا كالتالي:

    لو قمت بذهاب الى الاستوديو واختيار 6 صور على سبيل المثال سوف يتم عرض للمستخدم لدي اربع صور وذلك بسبب السطر هذا :

       itemCount: _imageFileList !=null ?  _imageFileList.length.clamp(0, 4) : 0,

     

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

     

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

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

     

    الكود كامل اصبح بشكل التالي:

    
    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Image Picker Demo',
          home: MyHomePage(title: 'Image Picker Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<XFile> _imageFileList;
    
      set _imageFile(XFile value) {
        _imageFileList = value == null ? null : [value];
      }
    
    
      bool isVideo = false;
      final ImagePicker _picker = ImagePicker();
    
      static const int MAX_PHOTO_UPLOAD = 4;
    
    
      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
        if (isMultiImage) {
          try {
            final pickedFileList = await _picker.pickMultiImage(
              //   maxWidth: 120,
              // maxHeight: 120,
              imageQuality: 100,
            );
    
            if (_imageFileList == null ) {
              if (pickedFileList == null)
                return;
              setState(() {
                _imageFileList = pickedFileList;
              });
            } else {
              if (pickedFileList != null) {
    
                setState(() {
                  _imageFileList =
                      [..._imageFileList, ...pickedFileList].toSet().toList();
                });
              }
    
            }
          } catch (e) {
            setState(() {
    
            });
          }
        }
      }
    
    
    
    
    
    
      Future<void> retrieveLostData() async {
        final LostDataResponse response = await _picker.retrieveLostData();
        if (response.isEmpty) {
          return;
        }
        if (response.file != null) {
          if (response.type == RetrieveType.video) {
            isVideo = true;
    
          } else {
            isVideo = false;
            setState(() {
              _imageFile = response.file;
              _imageFileList = response.files;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
    
          body: Center(
            child: !kIsWeb && defaultTargetPlatform == TargetPlatform.android
                ? FutureBuilder<void>(
              future: retrieveLostData(),
              builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const Text(
                      'You have not yet picked an image.',
                      textAlign: TextAlign.center,
                    );
                  case ConnectionState.done:
                    return
    
    
    
                      Column(
                        children: [
                          Expanded(
                            child: ListView.builder(
                              scrollDirection:
                              Axis.horizontal,
                              key: UniqueKey(),
                              itemBuilder: (context, index) {
                                return Semantics(
                                    label: 'image_picker_example_picked_image',
                                    child: kIsWeb
                                        ?  Image.network(_imageFileList[index].path,fit: BoxFit.cover,)
    
                                        :
                                       Image.file(File(_imageFileList[index].path),fit: BoxFit.cover,)
    
                                );
                              },
                              itemCount: _imageFileList !=null ?  _imageFileList.length.clamp(0, 4) : 0,
                            ),
                          ),
    
    
                          SizedBox(
                            height: 5,
                          ),
    
    
                          Padding(
                            padding:
                            const EdgeInsets.only(
                                left: 3,
                                right: 3),
                            child: Container(
                                height: 50,
    width: 100,
    
                                child: Material(
                                  color: Colors.deepOrange,
    
                                  child: InkWell(
                                      borderRadius:
                                      BorderRadius
                                          .circular(
                                          8),
                                      child: Icon(
                                        Icons
                                            .add_a_photo,
                                        color: Theme.of(
                                            context)
                                            .floatingActionButtonTheme
                                            .foregroundColor,
                                      ),
                                      onTap: () async {
                                        if  (_imageFileList != null && _imageFileList.length == MAX_PHOTO_UPLOAD){
                                          showDialog(
                                            context:
                                            context,
                                            builder:
                                                (ctx) =>
                                                AlertDialog(
    
                                                  content: Text(
                                                      "No more can be added"
                                                  ),
                                                  actions: <
                                                      Widget>[
                                                    TextButton(
                                                      onPressed:
                                                          () {
                                                        Navigator.of(ctx).pop();
                                                      },
                                                      child:
                                                      Text("Closes"),
                                                    ),
    
                                                  ],
                                                ),
                                          );
    
                                          return;
                                        } _onImageButtonPressed(
                                          ImageSource.gallery,
                                          context: context,
                                          isMultiImage: true,
                                        );
    
                                      }),
                                )),
                          )
    
    
    
    
                        ],
                      );
    
    
                  default:
                    if (snapshot.hasError) {
                      return Text(
                        'Pick image/video error: ${snapshot.error}}',
                        textAlign: TextAlign.center,
                      );
                    } else {
                      return const Text(
                        'You have not yet picked an image.',
                        textAlign: TextAlign.center,
                      );
                    }
                }
              },
            )
                :    ListView.builder(
              scrollDirection:
              Axis.horizontal,
              key: UniqueKey(),
              itemBuilder: (context, index) {
                return Semantics(
                  label: 'image_picker_example_picked_image',
                  child: kIsWeb
                      ? Image.network(_imageFileList[index].path,fit: BoxFit.cover,
                    width: 100,
                    height: 50,)
                      : Image.file(File(_imageFileList[index].path),fit: BoxFit.cover,
                    width: 100,
                    height: 50,),
                );
              },
              itemCount: _imageFileList.length,
            ),
          ),
    
        );
      }
    
    
    
    
    }
    
    

     

    • أعجبني 1
  11. بتاريخ 7 ساعات قال Wael Aljamal:

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

    شاركنا تجربتك. 

     

    مرحبا اخي الكريم @Wael Aljamal

    قمت بتجربه كثير بشكل التالي ولكن دائما احصل على نتيجة خطاء كالتالي:

    الكود المستعمل بشكل منفصل:

     static const int MAX_PHOTO_UPLOAD = 3;
           Padding(
                            padding:
                            const EdgeInsets.only(
                                left: 3,
                                right: 3),
                            child: Container(
                                height: 50,
    width: 100,
    
                                child: Material(
                                  color: Colors.deepOrange,
    
                                  child: InkWell(
                                      borderRadius:
                                      BorderRadius
                                          .circular(
                                          8),
                                      child: Icon(
                                        Icons
                                            .add_a_photo,
                                        color: Theme.of(
                                            context)
                                            .floatingActionButtonTheme
                                            .foregroundColor,
                                      ),
                                      onTap: () async {
                                        if (_imageFileList.length == MAX_PHOTO_UPLOAD) {
                                          showDialog(
                                            context:
                                            context,
                                            builder:
                                                (ctx) =>
                                                AlertDialog(
    
                                                  content: Text(
                                                      "No more can be added"
                                                  ),
                                                  actions: <
                                                      Widget>[
                                                    TextButton(
                                                      onPressed:
                                                          () {
                                                        Navigator.of(ctx).pop();
                                                      },
                                                      child:
                                                      Text("Closes"),
                                                    ),
    
                                                  ],
                                                ),
                                          );
                                          return;
                                        }
                                        _onImageButtonPressed(
                                          ImageSource.gallery,
                                          context: context,
                                          isMultiImage: true,
                                        );
                                      }),
                                )),
                          )

    النتيجة:

    E/flutter (22452): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null.
    E/flutter (22452): Receiver: null
    E/flutter (22452): Tried calling: length
    E/flutter (22452): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
    E/flutter (22452): #1      _MyHomePageState.build.<anonymous closure>.<anonymous closure> (package:flutter_application_1/testtwo.dart:179:56)
    E/flutter (22452): #2      _MyHomePageState.build.<anonymous closure>.<anonymous closure> (package:flutter_application_1/testtwo.dart:178:42)
    E/flutter (22452): #3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:991:20)
    E/flutter (22452): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
    E/flutter (22452): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:607:11)
    E/flutter (22452): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
    E/flutter (22452): #7      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7)
    E/flutter (22452): #8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:475:9)
    E/flutter (22452): #9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:93:12)
    E/flutter (22452): #10     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:138:9)
    E/flutter (22452): #11     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
    E/flutter (22452): #12     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:136:18)
    E/flutter (22452): #13     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:122:7)
    E/flutter (22452): #14     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:381:19)
    E/flutter (22452): #15     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:361:22)
    E/flutter (22452): #16     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:278:11)
    E/flutter (22452): #17     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:316:7)
    E/flutter (22452): #18     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:280:5)
    E/flutter (22452): #19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:238:7)
    E/flutter (22452): #20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:221:7)
    E/flutter (22452): #21     _rootRunUnary (dart:async/zone.dart:1370:13)
    E/flutter (22452): #22     _CustomZone.runUnary (dart:async/zone.dart:1265:19)
    E/flutter (22452): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
    E/flutter (22452): #24     _invoke1 (dart:ui/hooks.dart:180:10)
    E/flutter (22452): #25     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:276:7)
    E/flutter (22452): #26     _dispatchPointerDataPacket (dart:ui/hooks.dart:96:31)
    E/flutter (22452): 

     

     

    الصفحة كامله

    
    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Image Picker Demo',
          home: MyHomePage(title: 'Image Picker Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<XFile> _imageFileList;
    
      set _imageFile(XFile value) {
        _imageFileList = value == null ? null : [value];
      }
    
    
      bool isVideo = false;
      final ImagePicker _picker = ImagePicker();
    
      static const int MAX_PHOTO_UPLOAD = 3;
      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
        if (isMultiImage) {
          try {
            final pickedFileList = await _picker.pickMultiImage(
              //   maxWidth: 120,
              // maxHeight: 120,
              imageQuality: 100,
            );
    
            if (_imageFileList == null) {
              if (pickedFileList == null)
                return;
              setState(() {
                _imageFileList = pickedFileList;
              });
            }
            else {
              if (pickedFileList != null) {
    
                setState(() {
                  _imageFileList =
                      [..._imageFileList, ...pickedFileList].toSet().toList();
                });
              }
    
            }
          } catch (e) {
            setState(() {
    
            });
          }
        }
      }
    
    
    
    
    
    
      Future<void> retrieveLostData() async {
        final LostDataResponse response = await _picker.retrieveLostData();
        if (response.isEmpty) {
          return;
        }
        if (response.file != null) {
          if (response.type == RetrieveType.video) {
            isVideo = true;
    
          } else {
            isVideo = false;
            setState(() {
              _imageFile = response.file;
              _imageFileList = response.files;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
    
          body: Center(
            child: !kIsWeb && defaultTargetPlatform == TargetPlatform.android
                ? FutureBuilder<void>(
              future: retrieveLostData(),
              builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const Text(
                      'You have not yet picked an image.',
                      textAlign: TextAlign.center,
                    );
                  case ConnectionState.done:
                    return
    
    
    
                      Column(
                        children: [
                          Expanded(
                            child: ListView.builder(
                              scrollDirection:
                              Axis.horizontal,
                              key: UniqueKey(),
                              itemBuilder: (context, index) {
                                return Semantics(
                                    label: 'image_picker_example_picked_image',
                                    child: kIsWeb
                                        ?  Image.network(_imageFileList[index].path,fit: BoxFit.cover,)
    
                                        :
                                       Image.file(File(_imageFileList[index].path),fit: BoxFit.cover,)
    
                                );
                              },
                              itemCount: _imageFileList !=null ?  _imageFileList.length : 0,
                            ),
                          ),
    
    
                          SizedBox(
                            height: 5,
                          ),
    
    
                          Padding(
                            padding:
                            const EdgeInsets.only(
                                left: 3,
                                right: 3),
                            child: Container(
                                height: 50,
    width: 100,
    
                                child: Material(
                                  color: Colors.deepOrange,
    
                                  child: InkWell(
                                      borderRadius:
                                      BorderRadius
                                          .circular(
                                          8),
                                      child: Icon(
                                        Icons
                                            .add_a_photo,
                                        color: Theme.of(
                                            context)
                                            .floatingActionButtonTheme
                                            .foregroundColor,
                                      ),
                                      onTap: () async {
                                        if (_imageFileList.length == MAX_PHOTO_UPLOAD) {
                                          showDialog(
                                            context:
                                            context,
                                            builder:
                                                (ctx) =>
                                                AlertDialog(
    
                                                  content: Text(
                                                      "No more can be added"
                                                  ),
                                                  actions: <
                                                      Widget>[
                                                    TextButton(
                                                      onPressed:
                                                          () {
                                                        Navigator.of(ctx).pop();
                                                      },
                                                      child:
                                                      Text("Closes"),
                                                    ),
    
                                                  ],
                                                ),
                                          );
                                          return;
                                        }
                                        _onImageButtonPressed(
                                          ImageSource.gallery,
                                          context: context,
                                          isMultiImage: true,
                                        );
                                      }),
                                )),
                          )
    
    
    
    
                        ],
                      );
    
    
                  default:
                    if (snapshot.hasError) {
                      return Text(
                        'Pick image/video error: ${snapshot.error}}',
                        textAlign: TextAlign.center,
                      );
                    } else {
                      return const Text(
                        'You have not yet picked an image.',
                        textAlign: TextAlign.center,
                      );
                    }
                }
              },
            )
                :    ListView.builder(
              scrollDirection:
              Axis.horizontal,
              key: UniqueKey(),
              itemBuilder: (context, index) {
                return Semantics(
                  label: 'image_picker_example_picked_image',
                  child: kIsWeb
                      ? Image.network(_imageFileList[index].path,fit: BoxFit.cover,
                    width: 100,
                    height: 50,)
                      : Image.file(File(_imageFileList[index].path),fit: BoxFit.cover,
                    width: 100,
                    height: 50,),
                );
              },
              itemCount: _imageFileList.length,
            ),
          ),
    
        );
      }
    
    
    
    
    }
    
    

     

    • أعجبني 1
  12. بتاريخ 4 ساعات قال Wael Aljamal:

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

    شاركنا تجربتك. 

    اهلا بك اخي الكريم 

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

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

    يمكنك عرض تنبيه للمستخدم مثلا على شكل Toast إشعار تنبيهات، كما يمكن وضع تنويه ضمن الزر اكتب حد اقصى 4 او Max (4) .. Select imgs up to 4...

    وبعد انتهاء المستخدم من التحديد، إن كان حجم القائمة أكبر من 4 اعرض له تنبيه جديد بخبره أن اول 4 صور سيتم اختيارها. واقتطع القائمة محتفظاً بأربع عناصر.

    مرحبا اخي الكريم 

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

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

  14. بتاريخ منذ ساعة مضت قال بلال زيادة:

    لقد استعملت هذه الحزمة كثيرا و لم أجد ما تطلبه بها و لكن هناك حل ما و هو عندما يقوم المستخدم باختيار الصور , تقوم أنت فقط بعرض 4 صور من الصور المختارة و لا تعرض أكثر من ذلك حسب ما تريد. 

     

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

    • أعجبني 1
  15. تحيه طيبه للجميع 

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

     

    انا استعمل المكتبه التاليه : image_picker

     // Pick multiple images
        final List<XFile>? images = await _picker.pickMultiImage();

     

     

    الكود كامل :

    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Image Picker Demo',
          home: MyHomePage(title: 'Image Picker Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<XFile> _imageFileList;
    
      set _imageFile(XFile value) {
        _imageFileList = value == null ? null : [value];
      }
    
      dynamic _pickImageError;
      bool isVideo = false;
      final ImagePicker _picker = ImagePicker();
    
    
      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
        if (isMultiImage) {
          try {
            final pickedFileList = await _picker.pickMultiImage(
              maxWidth: 66,
              maxHeight: 66,
              imageQuality: 66,
            );
    
            if (_imageFileList == null) {
              if (pickedFileList == null)
                return;
              setState(() {
                _imageFileList = pickedFileList;
              });
            }
            else {
              if (pickedFileList != null) {
                setState(() {
                  _imageFileList =
                      [..._imageFileList, ...pickedFileList].toSet().toList();
                });
              }
              // لا تغيير
            }
          } catch (e) {
            setState(() {
              _pickImageError = e;
            });
          }
        }
      }
    
    
    
      Widget _previewImages() {
    
    
        if (_imageFileList != null) {
          return Semantics(
              child: ListView.builder(
                key: UniqueKey(),
                itemBuilder: (context, index) {
                  return Semantics(
                    label: 'image_picker_example_picked_image',
                    child: kIsWeb
                        ? Image.network(_imageFileList[index].path)
                        : Image.file(File(_imageFileList[index].path)),
                  );
                },
                itemCount: _imageFileList.length,
              ),
              label: 'image_picker_example_picked_images');
        } else if (_pickImageError != null) {
          return Text(
            'Pick image error: $_pickImageError',
            textAlign: TextAlign.center,
          );
        } else {
          return const Text(
            'You have not yet picked an image.',
            textAlign: TextAlign.center,
          );
        }
      }
    
    
      Future<void> retrieveLostData() async {
        final LostDataResponse response = await _picker.retrieveLostData();
        if (response.isEmpty) {
          return;
        }
        if (response.file != null) {
          if (response.type == RetrieveType.video) {
            isVideo = true;
    
          } else {
            isVideo = false;
            setState(() {
              _imageFile = response.file;
              _imageFileList = response.files;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: !kIsWeb && defaultTargetPlatform == TargetPlatform.android
                ? FutureBuilder<void>(
              future: retrieveLostData(),
              builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const Text(
                      'You have not yet picked an image.',
                      textAlign: TextAlign.center,
                    );
                  case ConnectionState.done:
                    return _previewImages();
                  default:
                    if (snapshot.hasError) {
                      return Text(
                        'Pick image/video error: ${snapshot.error}}',
                        textAlign: TextAlign.center,
                      );
                    } else {
                      return const Text(
                        'You have not yet picked an image.',
                        textAlign: TextAlign.center,
                      );
                    }
                }
              },
            )
                : _previewImages(),
          ),
          floatingActionButton: Column(
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget>[
    
              Padding(
                padding: const EdgeInsets.only(top: 16.0),
                child: FloatingActionButton(
                  onPressed: () {
                    isVideo = false;
                    _onImageButtonPressed(
                      ImageSource.gallery,
                      context: context,
                      isMultiImage: true,
                    );
                  },
                  heroTag: 'image1',
                  tooltip: 'Pick Multiple Image from gallery',
                  child: const Icon(Icons.photo_library),
                ),
              ),
    
    
    
            ],
          ),
        );
      }
    
    
    
    
    }

     

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

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

    لنحاول التعديل:

    
    try {
      final pickedFileList = await _picker.pickMultiImage(
        maxWidth: 66,
        maxHeight: 66,
        imageQuality: 66,
      );
    	
      if (_imageFileList == null) {
       if ( pickedFileList == null)
        return;
        setState(() {
               _imageFileList =pickedFileList;
    	});
      }
      else {
      	if (pickedFileList != null) {
          setState(() {
                 _imageFileList = [..._imageFileList, ...pickedFileList].toSet().toList();
          });
        }
      // لا تغيير
      }
      
      
    } catch (e) {
      setState(() {
               _pickImageError = e;
       });
    }

     

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

     

    الكود كامل بعد التعديل للفائده

    
    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Image Picker Demo',
          home: MyHomePage(title: 'Image Picker Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<XFile> _imageFileList;
    
      set _imageFile(XFile value) {
        _imageFileList = value == null ? null : [value];
      }
    
      dynamic _pickImageError;
      bool isVideo = false;
      final ImagePicker _picker = ImagePicker();
    
    
      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
        if (isMultiImage) {
          try {
            final pickedFileList = await _picker.pickMultiImage(
              maxWidth: 66,
              maxHeight: 66,
              imageQuality: 66,
            );
    
            if (_imageFileList == null) {
              if (pickedFileList == null)
                return;
              setState(() {
                _imageFileList = pickedFileList;
              });
            }
            else {
              if (pickedFileList != null) {
                setState(() {
                  _imageFileList =
                      [..._imageFileList, ...pickedFileList].toSet().toList();
                });
              }
              // لا تغيير
            }
          } catch (e) {
            setState(() {
              _pickImageError = e;
            });
          }
        }
      }
    
    
    
      Widget _previewImages() {
    
    
        if (_imageFileList != null) {
          return Semantics(
              child: ListView.builder(
                key: UniqueKey(),
                itemBuilder: (context, index) {
                  return Semantics(
                    label: 'image_picker_example_picked_image',
                    child: kIsWeb
                        ? Image.network(_imageFileList[index].path)
                        : Image.file(File(_imageFileList[index].path)),
                  );
                },
                itemCount: _imageFileList.length,
              ),
              label: 'image_picker_example_picked_images');
        } else if (_pickImageError != null) {
          return Text(
            'Pick image error: $_pickImageError',
            textAlign: TextAlign.center,
          );
        } else {
          return const Text(
            'You have not yet picked an image.',
            textAlign: TextAlign.center,
          );
        }
      }
    
    
      Future<void> retrieveLostData() async {
        final LostDataResponse response = await _picker.retrieveLostData();
        if (response.isEmpty) {
          return;
        }
        if (response.file != null) {
          if (response.type == RetrieveType.video) {
            isVideo = true;
    
          } else {
            isVideo = false;
            setState(() {
              _imageFile = response.file;
              _imageFileList = response.files;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: !kIsWeb && defaultTargetPlatform == TargetPlatform.android
                ? FutureBuilder<void>(
              future: retrieveLostData(),
              builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const Text(
                      'You have not yet picked an image.',
                      textAlign: TextAlign.center,
                    );
                  case ConnectionState.done:
                    return _previewImages();
                  default:
                    if (snapshot.hasError) {
                      return Text(
                        'Pick image/video error: ${snapshot.error}}',
                        textAlign: TextAlign.center,
                      );
                    } else {
                      return const Text(
                        'You have not yet picked an image.',
                        textAlign: TextAlign.center,
                      );
                    }
                }
              },
            )
                : _previewImages(),
          ),
          floatingActionButton: Column(
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget>[
    
              Padding(
                padding: const EdgeInsets.only(top: 16.0),
                child: FloatingActionButton(
                  onPressed: () {
                    isVideo = false;
                    _onImageButtonPressed(
                      ImageSource.gallery,
                      context: context,
                      isMultiImage: true,
                    );
                  },
                  heroTag: 'image1',
                  tooltip: 'Pick Multiple Image from gallery',
                  child: const Icon(Icons.photo_library),
                ),
              ),
    
    
    
            ],
          ),
        );
      }
    
    
    
    
    }
    
    

     

    • أعجبني 1
  17. بتاريخ 15 دقائق مضت قال Wael Aljamal:

    أعتقد أن القائمة الأولى فارغة

    جرب التالي:

    
    setState(() {
    	_imageFileList = [..._imageFileList, ...pickedFileList].toSet().toList();
    });

    ++ اختبر أن القائمة الجديدة ليست فارغة

    اهلا اخي 

    تم وضع الكود بشكل التالي :

      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
       if (isMultiImage) {
    
                try {
                  final pickedFileList = await _picker.pickMultiImage(
                    maxWidth: 66,
                    maxHeight: 66,
                    imageQuality: 66,
                  );
    
                  setState(() {
                    _imageFileList = [..._imageFileList, ...pickedFileList].toSet().toList();
                  });
                } catch (e) {
                  setState(() {
                    _pickImageError = e;
                  });
                }
    
    
    
        }
      }

     

    وقد حصل الخطاء التالي:

     

    11.thumb.png.45f21d4624bc192ea097bc8277043589.png

     

    بتاريخ 29 دقائق مضت قال Wael Aljamal:

    تريد الإضافة.. لربما اختار المستخدم نفس الصورة السابقة سوف تتكرر. سوف ندمج القائمة السابقة مع التحديد الجديد (القائمة الجديدة) بدون تكرار

    
    setState(() {
    	_imageFileList = (_imageFileList + pickedFileList).toSet().toList();
    });

    الطريقة toSet تقوم بعمل مجموعة من القائمة، والمجموعة هي عناصر غير مكررة، سندمج القائمتين، ونعيد من الناتج مجموعة، ثم نحولها إلى قائمة..

    الطريقة + تدمج سلسلتين في Dart 2، طريقة ثانية:

    
    final tmp = new List.from(_imageFileList)..addAll(pickedFileList);
    
    final tmp2 = tmp.toSet().toList();
    
    setState(() {
    	_imageFileList = tmp2;
    });

     

    Dart الأقدم تستخدم addAll 

    ايضا قمت تبطبيق هذا الامر :

    void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
       if (isMultiImage) {
    
                try {
                  final pickedFileList = await _picker.pickMultiImage(
                    maxWidth: 66,
                    maxHeight: 66,
                    imageQuality: 66,
                  );
    
                  final tmp = new List.from(_imageFileList)..addAll(pickedFileList);
    
                  final tmp2 = tmp.toSet().toList();
    
                  setState(() {
                    _imageFileList = tmp2;
                  });
                } catch (e) {
                  setState(() {
                    _pickImageError = e;
                  });
                }
    
    
    
        }
      }

    وقد حصلت على خطاء مشابه للكود السابق

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

    تريد الإضافة.. لربما اختار المستخدم نفس الصورة السابقة سوف تتكرر. سوف دمج القائمة السابقة مع التحديد الجديد بدون تكرار

    
    setState(() {
    	_imageFileList = (_imageFileList + pickedFileList).toSet().toList();
    });

    الطريقة toSet تقوم بعمل مجموعة من القائمة، والمجموعة هي عناصر غير مكررة، سندمج القائمتين، ونعيد من الناتج مجموعة، ثم نحولها إلى قائمة..

    الطريقة + تدمج سلسلتين في Dart 2، طريقة ثانية:

    
    final tmp = new List.from(_imageFileList)..pickedFileList(list2);
    
    setState(() {
    	_imageFileList = tmp;
    });

     

    اهلا بك اخي الكريم 

    قمت بتطبيق الطريقة الاولى ولكن يظهر لدي المشكله التاليه مرفق صوره :

    device-2021-10-12-232429.thumb.png.86e03e0d9d11bc01f7ec27b0973b51b5.png

    • أعجبني 1
  19. تحيه طيبه للجميع

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

     // Pick multiple images
        final List<XFile>? images = await _picker.pickMultiImage();

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

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

     

    الكود كامل:

    
    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Image Picker Demo',
          home: MyHomePage(title: 'Image Picker Example'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      List<XFile> _imageFileList;
    
      set _imageFile(XFile value) {
        _imageFileList = value == null ? null : [value];
      }
    
      dynamic _pickImageError;
      bool isVideo = false;
      final ImagePicker _picker = ImagePicker();
    
    
      void _onImageButtonPressed(ImageSource source,
          {BuildContext context, bool isMultiImage = false}) async {
       if (isMultiImage) {
    
                try {
                  final pickedFileList = await _picker.pickMultiImage(
                    maxWidth: 66,
                    maxHeight: 66,
                    imageQuality: 66,
                  );
                  setState(() {
                    _imageFileList = pickedFileList;
                  });
                } catch (e) {
                  setState(() {
                    _pickImageError = e;
                  });
                }
    
    
    
        }
      }
    
    
    
    
    
      Widget _previewImages() {
    
    
        if (_imageFileList != null) {
          return Semantics(
              child: ListView.builder(
                key: UniqueKey(),
                itemBuilder: (context, index) {
                  return Semantics(
                    label: 'image_picker_example_picked_image',
                    child: kIsWeb
                        ? Image.network(_imageFileList[index].path)
                        : Image.file(File(_imageFileList[index].path)),
                  );
                },
                itemCount: _imageFileList.length,
              ),
              label: 'image_picker_example_picked_images');
        } else if (_pickImageError != null) {
          return Text(
            'Pick image error: $_pickImageError',
            textAlign: TextAlign.center,
          );
        } else {
          return const Text(
            'You have not yet picked an image.',
            textAlign: TextAlign.center,
          );
        }
      }
    
    
      Future<void> retrieveLostData() async {
        final LostDataResponse response = await _picker.retrieveLostData();
        if (response.isEmpty) {
          return;
        }
        if (response.file != null) {
          if (response.type == RetrieveType.video) {
            isVideo = true;
    
          } else {
            isVideo = false;
            setState(() {
              _imageFile = response.file;
              _imageFileList = response.files;
            });
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: !kIsWeb && defaultTargetPlatform == TargetPlatform.android
                ? FutureBuilder<void>(
              future: retrieveLostData(),
              builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const Text(
                      'You have not yet picked an image.',
                      textAlign: TextAlign.center,
                    );
                  case ConnectionState.done:
                    return _previewImages();
                  default:
                    if (snapshot.hasError) {
                      return Text(
                        'Pick image/video error: ${snapshot.error}}',
                        textAlign: TextAlign.center,
                      );
                    } else {
                      return const Text(
                        'You have not yet picked an image.',
                        textAlign: TextAlign.center,
                      );
                    }
                }
              },
            )
                : _previewImages(),
          ),
          floatingActionButton: Column(
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget>[
    
              Padding(
                padding: const EdgeInsets.only(top: 16.0),
                child: FloatingActionButton(
                  onPressed: () {
                    isVideo = false;
                    _onImageButtonPressed(
                      ImageSource.gallery,
                      context: context,
                      isMultiImage: true,
                    );
                  },
                  heroTag: 'image1',
                  tooltip: 'Pick Multiple Image from gallery',
                  child: const Icon(Icons.photo_library),
                ),
              ),
    
    
    
            ],
          ),
        );
      }
    
    
    
    
    }
    
    

     

    • أعجبني 1
  20. بتاريخ 25 دقائق مضت قال Wael Aljamal:

    حاول عمل Flutter clean وإعادة تشغيل XCODE - حذف الذاكرة المؤقتة - إعادة بناء المشروع..

    اهلا بك اخي الكريم

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

    GoogleService-Info.plist

    لا اعلم ما هو سبب ان سابقا يقوم الويندوز بتحميل الملف بصيغه المشار لها اعلاه ولكن المشكله ان الاصدارات تحت ios 15  كانت تعمل عليه ايضا لذلك لم استطع الانتباه للمشكله 

     

    كل الشكر لك اخي الكريم توجيهاتك ساعدتني كثير لكتشاف ذلك 

    • أعجبني 1
  21. بتاريخ 7 دقائق مضت قال Wael Aljamal:

    الحل هو إعادة تضمين ملف إعادادت firebase من خلال القائمة التالية.. حسب الصورة.. اعمل نسخة من الملف خارج المشروع واحذف التي يحويها المشروع، ثم من القائمة اعمل على تضمين الملف مجدداً..

    add-file.thumb.PNG.1d881dc1b0c7c340c6c92ac3538786ea.PNG

    لاحظ المشكلة أن XCODE لن يربط الملف مع المروع في حال تم وضعه من متصفح الملفات.

    إنما عليك إضافته من القائمة

    ios1.thumb.PNG.140a06d7957c0ec7a4edb95d078ad67f.PNGios2.thumb.PNG.001c56979e26a11c5dac4ae4f936390a.PNG

    إعادة تشغيل XCODE ربما تحل المشكلة

    اهلا بك اخي الكريم

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

    • أعجبني 1
  22. بتاريخ 3 ساعات قال Wael Aljamal:

    حسنا، حاول حذف المفتاحين

    اهلا بك اخي الكريم

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

    https://stackoverflow.com/questions/68467306/the-code-signature-version-is-no-longer-supported

     

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

     

    021-10-03 16:06:23.524137+0400 Runner[784:113257] Warning: Unable to create restoration in progress marker file
    2021-10-03 16:06:23.526996+0400 Runner[784:113515] 8.7.0 - [Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
    2021-10-03 16:06:23.527161+0400 Runner[784:113257] *** Terminating app due to uncaught exception 'com.firebase.core', reason: '`FirebaseApp.configure()` could not find a valid GoogleService-Info.plist in your project. Please download one from https://console.firebase.google.com/.'
    *** First throw call stack:

    طبعا ملف الفايربيز موجود وشغال ايضا لو قمت بتشغيله على ios  اقل من 15 مثال 14 

    هاتف حقيقي او محاكي ولكن مع ios 15  تظهر هذا الرساله 

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

  23. بتاريخ 8 ساعات قال Wael Aljamal:
    • أحدهم قام بحذف الهاتف من ذاكرة Xcode أي عمل له unregister ثم أعاد وصله
    • قد تضطر للذهاب لحساب مطور أبل لديك، في قسم 'Certificates, Identifiers & Profiles' > profiles > provisioning profiles ثم إضافة الجهاز الذي تستعمله للاختبار، اتبع بعض الخطوات وسوف تحصل على ملف قم بتحميله بأي اسم.. ثم قم بتشغيله بالنقر المزدوج عليه سيتم ربط الهاتف وحل المشكلة
    • حاول تحديث مكتبات XCODE

     

    ربما تحتاج لإعادة توقيع التطبيق مع التنسيق الجديد له Using the Latest Code Signature Format..

    لحل المشكلة التي سببها تحديث نظام IOS عن طريق Flutter اتبع التوثيق المقدم من فلاتر:

    ربما يوجد مفتاحين تحقق للجهاز، احذف الأول

    
    security find-identity -p codesigning -v
    
    security delete-identity -Z المفتاح لديك

    security-find-identity.PNG.03fc47271923be62cbcff76e4336e365.PNG

    وشرح إضافي من القائمين على Flutter من  github

    اهلا بك اخي الكريم

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

     

    ا

×
×
  • أضف...