How to listen to changes of a singleton class that extends changeNotifer with getit package?

Issue

I’m using getit package from flutter. How to listen to changes of a singleton class that extends changeNotifer with getit package?

class UserService extends ChangeNotifier {
 Database _db = serviceLocator<Database>();

  User user;

  Future<void> loadUserFromDatabase(String userId) async {
    User user = await _db.getUser(userId);

      if (user != null) {
        updateUser(user: user);
      }
  }

  void updateUser({
    User user,
  }) {
    this.user = user;
    notifyListeners();
  }
}


// SERVICE LOCATOR
GetIt serviceLocator = GetIt.instance;

void setupServiceLocator() {
 serviceLocator.registerLazySingleton<Database>(
    () => DatabaseImpl(),
  );
  serviceLocator.registerLazySingleton<UserService>(
    () => UserService(),
  );
}

class UserDetailsPage extends StatelessWidget {
  final _service = serviceLocator<UserService>();

  @override
  Widget build(BuildContext context) {
    return return Container(
        padding: const EdgeInsets.all(8.0),
        child: Text(
              _service.user != null
                  ? _service.user.name
                  : "",
            ),
     );
  }

In the above code, how to reflect changes in name to UserDetailsPage?

Solution

you can use the StatefullWidget to achieve your requirement and easy to update the details page.

Add the listener and notify the widget on every time updating it.

class UserDetailsPage extends StatefulWidget {
  @override
  _UserDetailsPageState createState() => _UserDetailsPageState();
}

class _UserDetailsPageState extends State<UserDetailsPage> {
  final _service = serviceLocator<UserService>();
  
  void initState(){
    super.initState();
    _service?.addListener(updateUserDetails);
  }

  void updateUserDetails(){
    setState((){});
  }
  
  @override
  Widget build(BuildContext context) {
    return return Container(
      padding: const EdgeInsets.all(8.0),
      child: Text(
        userService.user != null
            ? _service.user.name
            : "",
      ),
    );
  }
}

Answered By – Balasubramani Sundaram

Answer Checked By – Terry (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *