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

كيفية تحويل قيمة استرداد Firestore من String إلى Map<String, dynamic> في Flutter؟

Flutter Dev

السؤال

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

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

احاول عمل اتصال مع قاعدة الفايربيز لدي collection يحتوي على مجموعة صور على شكل array  

صورة ك مثال :
t5x6m.thumb.png.48baa7be50c19d150cac6a585fa37f52.png
 

 

احتاج ان اجلب جميع الصور حتى أقوم بعرضهم في pageview 

ولكني اواجه المشكلة التأليه في كل مره :
 

type 'String' is not a subtype of type 'Map<String, dynamic>'

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

 Future<void> _fetchData() async {
    try {
      QuerySnapshot querySnapshot =
      await FirebaseFirestore.instance.collection('books')  .where('id', isEqualTo: 2012).get();
      List<dynamic> myArray = querySnapshot.docs.first.get('ImageTopic') ?? [];

      setState(() {
        _ListDataDisplayImageTopic.addAll(myArray
            .map((item) => ImageTopicModel.fromJson(item))
            .toList());

        _isloding = false;
      });
    } catch (e) {
      print(e.toString());
      setState(() {
        _isloding = false;
      });
    }
  }
class ImageTopicModel {
  String? imageId;
  String? imageTopic;


  ImageTopicModel(
      {this.imageId, this.imageTopic});

  ImageTopicModel.fromJson(Map<String, dynamic> json) {
    imageId = json['Image_id'].toString();
    imageTopic = json['ImageTopic'].toString();

  }

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

    return data;
  }
}

وسأقوم بعرضهم بشكل التالي:
 

 PageView.builder(
          controller: _pageController,
          itemCount: _ListDataDisplayImageTopic.length,
          itemBuilder: (context, index) {
            return Image.network(
              "${_ListDataDisplayImageTopic[index].imageTopic}",
              fit: BoxFit.cover, 
              width: 200, 
              height: 200, 
            );
          },
        ),

فيه احد يعرف كيف ممكن نحل هذا المشكلة؟

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

في البداية الخطأ الذي تواجهه يحدث عند استخدام String بدلاً من Map<String, dynamic>، والسبب في الخطأ هو أنَّ قيمة "ImageTopic" في الكود الخاص بك ليست في صيغة JSON صحيحة.

حاول التأكد من أن جميع القيم الموجودة في حقل "ImageTopic" تم تخزينها بصيغة JSON صحيحة، أيضًا التأكد من أن موديل "ImageTopicModel" يتوافق مع القيم الموجودة في "ImageTopic".

ولتحديد الخطأ بشكل أدق، تستطيع تحويل الـ Map<String, dynamic> إلى String باستخدام JSON.encode() ومن ثم استخدام print() لطباعة الناتج، وهذا يمكن أن يساعد في تحديد ما إذا كانت البيانات الموجودة في حقل "ImageTopic" تتوافق مع JSON صحيح أم لا.

استخدم الكود التالي لتحويل الـ Map<String, dynamic> إلى String:

final jsonString = json.encode(myMap);

ولتحويل الـ String إلى Map<String, dynamic> استخدام هذا الكود:

final myMap = json.decode(jsonString);

وأيضًا حاول تغيير هذا السطر في الكود:

List<dynamic> myArray = querySnapshot.docs.first.get('ImageTopic') ?? [];

إلى هذا الشكل:

List<dynamic> myArray = List<Map<String, dynamic>>.from(querySnapshot.docs.first.get('ImageTopic') ?? []);

هذا التغيير سيحول النوع المسترجع من البيانات إلى List<Map<String, dynamic>> والذي يمكن استخدامه في الخطوة التالية من تحويل العناصر إلى قائمة من Model objects.

وبعد ذلك، يجب تحديث تابع fromJson() في ImageTopicModel ليتعامل مع Map<String, dynamic> بدلاً من String.

استخدام الكود التالي كنموذج للتحديث:

factory ImageTopicModel.fromJson(Map<String, dynamic> json) {
  return ImageTopicModel(
    imageTopic: json['imageTopic'],
  );
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...