flutterfirebasedart

I keep getting Instance of SongEntity in my firebase project


Im trying to fetch a list of songs from firebase and add them all to a list of songs

Code for the SongEntity

import 'package:cloud_firestore/cloud_firestore.dart';

class SongEntity {
  final String songId;
  final String title;
  final String artist;
  final String link;
  final String imageUrl;

  SongEntity({
    required this.songId,
    required this.title,
    required this.artist,
    required this.link,
    required this.imageUrl,
  });

  factory SongEntity.fromDocument(DocumentSnapshot doc) {
    final data = doc.data() as Map<String, dynamic>;
    return SongEntity(
      songId: doc.id,
      title: data['title'],
      artist: data['artist'],
      link: data['link'],
      imageUrl: data['image'],
    );
  }
}
 

Code for the PlaylistProvider class that has the function to get the songs from firestore

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

import '../../../domain/entities/song_entities/song_entity.dart';

class PlaylistProvider with ChangeNotifier {
  List<SongEntity> _songs = [];

  List<SongEntity> get songs => _songs;

  getPlaylistFromFirestore(String collectionName, String playlistName) async {
    final fireStore = FirebaseFirestore.instance;
    await fireStore.collection(collectionName).get().then(
      (querySnapshot) {
        for (var docSnapshot in querySnapshot.docs) {
          print('${docSnapshot.id} => ${docSnapshot.data()['artist']}');
          _songs.add(SongEntity.fromDocument(docSnapshot));
          notifyListeners();
        }
      },
      onError: (e) => print("Error completing: $e"),
    );
  }
}

This part of the code works perfectly and all documents are printed out

  print('${docSnapshot.id} => ${docSnapshot.data()['artist']}');

But when i try to print the value of songs from my homepage

    print(Provider.of<PlaylistProvider>(context).songs);

I get this in console

I/flutter (10936): [Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity', Instance of 'SongEntity']

Any help will be greatly appreciated


Solution

  • Since you're printing the list of songs, it executes the toString of your SongEntity class - which defaults to the output you see.

    If you want to show a different output, override the toString method in your SongEntity class. For example, like this:

    class SongEntity {
      ...
      @override
      String toString() {
        return 'SongEntity(songId: $songId, title: $title, artist: $artist, link: $link, imageUrl: $imageUrl)';
      }
    }
    

    For a good explanation of toString, see What does @override toString method do in a Flutter Dart class?