Reputation: 197
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?
Upvotes: 1
Views: 2692
Reputation: 1290
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
: "",
),
);
}
}
Upvotes: 1