1

I'm using Provider to loading json data and refresh app state when any operation performed.

This is my Provider ChangeNotifier

    class ClassesDetails with ChangeNotifier {

    Future<void> getLiveClassList(String token) async {
    final url = FitApis.demoBaseURL + "live/class";
    try {
      final response = await http.get(url, headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': token,
      });
      //print(response.body);
      final responseData = json.decode(response.body);
      if (responseData['data'] != null) {
        notifyListeners();
        Map typesMap = jsonDecode(response.body);
        var types = new LiveClassListModel.fromJson(typesMap);
        _liveClassController.add(types);
      }
    } catch (error) {
      throw (error);
    }
  }

  final _liveClassController = StreamController<LiveClassListModel>();

  Stream<LiveClassListModel> get liveClassStream {
    return _liveClassController.stream;
  }

  void refreshLiveClasses(String token) {
    getLiveClassList(token);
  }
}

This is getIt used for access provider objects

final getIt = GetIt.instance;

void setup() {

  getIt.registerSingleton<ClassesDetails>(ClassesDetails());
  
}

Method call to get data

    Future<void> getLiveClassList() async {
    final classProvider = getIt<ClassesDetails>();
    
    classProvider.getLiveClassList("token)";
            classProvider.liveClassStream.listen((snapshot) { });
}

Refreshing data

 classProvider
            .refreshLiveClasses("token");

This is working perfectly. But the issue is that when i logout from app and login again it gives me error Bad state: Stream has already been listened to. I searched alot but not get helpful solution. I tried Flutter : Bad state: Stream has already been listened to but not working. I tried to classProvider.closeStream() but not working. Please help me how I solve this issue.

1 Answers1

3

I just created a same stream and found the issue, just change your StreamController like this:

final _liveClassController = StreamController<LiveClassListModel>.broadcast();
iDecode
  • 22,623
  • 19
  • 99
  • 186
Gursewak Singh
  • 1,576
  • 1
  • 16
  • 32