Search code examples
flutterflutter-providerdata-management

Flutter: How can i separate network and local data operations?


If user want to register or login to application i want to fetch data from network. But if user want to work local application get data from local data. I use provider for data management by the way. Can someone give me some idea?


Solution

    1. Create a parent ChangeNotifier and mark it abstract.

    2. Include in it all common member variables and declare methods without implementing them.

    3. Now create two ChangeNotifier that extends the parent

    4. Implement in each one the missing code for the methods in their parent ChangeNotifier

    5. Use the correct child ChangeNotifier depending on the online/offline state

    Here is an example :

    abstract class DataManagerNotifier extends ChangeNotifier {
    
      List currentData;
      String uID;
    
      void getData();
    
      void changeData();
    }
    

    and the 2 children will be like this :

    class OfflineDataManagerNotifier extends DataManagerNotifier {
      @override
      void changeData() {
        // TODO: implement changeData locally
      }
    
      @override
      void getData() {
        // TODO: implement getData locally
      }
      
    }
    

    and

    class OnlineDataManagerNotifier extends DataManagerNotifier {
      @override
      void changeData() {
        // TODO: implement changeData from network
      }
    
      @override
      void getData() {
        // TODO: implement getData from network
      }
      
    }
    

    finally, use them according to the state of user

    class Screen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    
        if(isOnlineMode){
          return ChangeNotifierProvider<DataManagerNotifier>(
              create: (context) => OnlineDataManagerNotifier(),
              child: _ScreenContent()
          );
        }
        return ChangeNotifierProvider<DataManagerNotifier>(
            create: (context) => OfflineDataManagerNotifier(),
            child: _ScreenContent()
        );
      }
    }
    

    And don't forget to make ChangeNotifierProvider as <DataManagerNotifier>