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

السؤال

نشر (معدل)

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

لدي استفسار لو تكرمتم

اشتغل على كود متكون من قسمين لعرض الصور

القسم الأول الصور التي احصل عليها من الفايربيز وهيا على شكل array

اما القسم الثاني هم صور أقوم بإضافتهم من الهاتف من خلال pickImage
طبعا فكرتي هيا إضافة صور جديد بجانب الصور التي تأتي من الفايربيز بمعنى في نفس القائمة او قائمة واحده ولكني اواجه مشكلة مع الصور التي اقوم بجلبها من الهاتف لا تعمل او لا تظهر او يتم عرضها على شكل مربع يحتوي على x 

صوره توضح المشكلة:
Untitled.jpg.17ed8b89d022a88d57e5ca0de8a16129.jpg

الصورة الأولى من اليمين (الساعة) هذا احصل عليها من الفايربيز وهيا تكمل بشكل تمام اما الصور الثلاث التأليه هيا المشكلة التي لدي

كيف يمكنني حل هذا المشكلة واضافة الجميع الى قائمة واحد؟
 



class ImageTopicModel {
  String? imageId;

  String? pOSTID;
  String? mainPicture;
  List<String>? imageUrls;
  bool isLocal = false; // Add the default value for isLocal field
  int? isMain_picture;

  ImageTopicModel({
    this.imageId,

    this.pOSTID,
    this.mainPicture,
    this.imageUrls,
    this.isLocal = false,
    this.isMain_picture,
  });

  ImageTopicModel.fromJson(Map<String, dynamic> json) {
    imageId = json['Image_id'].toString();
  
    pOSTID = json['POSTID'].toString();
    mainPicture = json['Main_picture'].toString();
    imageUrls = json['ImageTopic'] != null
        ? List<String>.from(json['ImageTopic'])
        : null;
    isLocal = json['isLocal'] ?? false;
    isMain_picture = json['isMain_picture'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['Image_id'] = this.imageId;

    data['POSTID'] = this.pOSTID;
    data['Main_picture'] = this.mainPicture;
    data['ImageTopic'] = this.imageUrls;
    data['isLocal'] = this.isLocal;
    data['isMain_picture'] = this.isMain_picture;

    return data;
  }

  String? get imageUrl =>
      imageUrls?.join(',').replaceAll(RegExp(r'[\[\]]'), '');
  set imageUrl(String? value) {
    if (value != null) {
      imageUrls = value.split(',');
    }
  }
}

class ImageCard extends StatefulWidget {
  var PostID;
  ImageCard({Key? key, this.PostID}) : super(key: key);

  @override
  State<ImageCard> createState() => _ImageCardState();
}

class _ImageCardState extends State<ImageCard> {
  List<ImageTopicModel> filteredUsers = [];
  final picker = ImagePicker();

  @override
  void initState() {
    init();
    super.initState();
  }

  Future<List<ImageTopicModel>> GetImageOfTopic() async {
    final document = await FirebaseFirestore.instance
        .collection('book')
        .where('id', isEqualTo: widget.PostID)
        .get();
    List<ImageTopicModel> listOfImages = document.docs.map((doc) {
      return ImageTopicModel.fromJson(doc.data());
    }).toList();

    return listOfImages;
  }

  Future<void> init() async {
    filteredUsers = [];
    selectedIndex = -1;
    List<ImageTopicModel> imageList = await GetImageOfTopic();
    filteredUsers.addAll(imageList);
    setState(() {});
  }

  Future<void> _captureImage() async {
    final XFile? image = await picker.pickImage(source: ImageSource.gallery);

    if (image != null) {
      setState(() {
        filteredUsers.add(ImageTopicModel(imageUrls: [image.path]));
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 150,
      child: ListView.builder(
        shrinkWrap: true,
        physics: AlwaysScrollableScrollPhysics(),
        scrollDirection: Axis.horizontal,
        itemCount: filteredUsers.length + 1,
        itemBuilder: (BuildContext context, int index) {
          if (index == filteredUsers.length) {
            // Render a button to select a new image
            return GestureDetector(
              onTap: _captureImage,
              child: Padding(
                padding: EdgeInsets.only(right: 10.0),
                child: Container(
                  height: 100,
                  width: 100,
                  decoration: BoxDecoration(
                    color: Colors.grey[200],
                    borderRadius: BorderRadius.circular(5.0),
                  ),
                  child: Icon(
                    Icons.add,
                    size: 40,
                    color: Colors.grey[400],
                  ),
                ),
              ),
            );
          }

          return Row(
            children: filteredUsers[index].imageUrls!.map((imageUrl) {
              return GestureDetector(
                onTap: () {
                  print('Image clicked! URL: $imageUrl');
                  // Perform any action you want when the image is clicked
                },
                child: Padding(
                  padding: EdgeInsets.only(right: 10.0),
                  // Adjust the spacing between images horizontally
                  child: Container(
                    height: 100,
                    width: 100,
                    child: Image.network(
                      imageUrl,
                      fit: BoxFit.cover,
                    ),
                  ),
                ),
              );
            }).toList(),
          );
        },
      ),
    );
  }
}

 

تم التعديل في بواسطة Flutter Dev

Recommended Posts

  • 1
نشر

هناك بعض الأمور التي يجب مراعاتها عند استخدام pickImage في Flutter.

أولاً، تأكد من أنك قمت بإضافة الاعتمادية الصحيحة لحزمة image_picker في ملف pubspec.yaml الخاص بمشروعك.

ثانياً، تأكد من أنك قمت بمعالجة صورة المعاينة التي تم اختيارها بنجاح، وتستطيع استخدام مكتبة معالجة الصور مثل flutter_image_compress لضغط الصورة وتحسين أدائها.

ثالثاً، في الكود الحالي، يتم تخزين مسار الصورة المحلية المحددة في حقل imageUrls كقيمة واحدة في قائمة الصور filteredUsers، ولكن العرض المتوقع يتطلب أن يحتوي كل عنصر في القائمة filteredUsers على قائمة من الصور المختارة، لذا يجب تعديل بعض الأجزاء في الكود.

في دالة _captureImage، عند إضافة الصورة المحلية الجديدة إلى filteredUsers، قم بتعديل الكود لإنشاء قائمة جديدة من الصور بدلاً من تخزين الصورة المحددة بمفردها، وبإمكانك تحقيق ذلك بتغيير السطر:

filteredUsers.add(ImageTopicModel(imageUrls: [image.path]));

إلى:

filteredUsers.add(ImageTopicModel(imageUrls: [image.path], isLocal: true));

وذلك للإ شارة أن هذه الصورة هي صورة محلية.

ثم في دالة build، قم بتعديل جزء إنشاء عناصر الصور داخل ListView.builder كما يلي:

return Container(
  height: 150,
  child: ListView.builder(
    // ...
    itemBuilder: (BuildContext context, int index) {
      // ...
      return Row(
        children: filteredUsers[index].imageUrls!.map((imageUrl) {
          if (filteredUsers[index].isLocal) {
            // عرض الصور المحلية
            return GestureDetector(
              onTap: () {
                print('Local image clicked! URL: $imageUrl');
                // Perform any action you want when the image is clicked
              },
              child: Padding(
                padding: EdgeInsets.only(right: 10.0),
                child: Container(
                  height: 100,
                  width: 100,
                  child: Image.file(
                    File(imageUrl),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
            );
          } else {
            // عرض الصور من الفايربيس
            return GestureDetector(
              onTap: () {
                print('Firebase image clicked! URL: $imageUrl');
                // Perform any action you want when the image is clicked
              },
              child: Padding(
                padding: EdgeInsets.only(right: 10.0),
                child: Container(
                  height: 100,
                  width: 100,
                  child: Image.network(
                    imageUrl,
                    fit: BoxFit.cover,
                  ),
                ),
              ),
            );
          }
        }).toList(),
      );
    },
  ),
);

وتلك التغييرات تتيح لك عرض الصور المحلية التي تم اختيارها من خلال pickImage بشكل صحيح بجانب الصور الأخرى التي تأتي من Firebase.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...