0

我正在使用颤振的 getit 包。如何使用 getit 包监听扩展 changeNotifer 的单例类的变化?

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
                  : "",
            ),
     );
  }

在上面的代码中,如何将名称的变化反映到 UserDetailsPage 中?

4

1 回答 1

1

您可以使用 StatefullWidget 来实现您的要求并轻松更新详细信息页面。

添加侦听器并在每次更新时通知小部件。

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
            : "",
      ),
    );
  }
}
于 2021-02-09T06:29:54.750 回答