【问题标题】:How to listen to changes of a singleton class that extends changeNotifer with getit package?如何使用 getit 包监听扩展 changeNotifer 的单例类的变化?
【发布时间】:2021-05-12 18:35:12
【问题描述】:

我正在使用来自 Flutter 的 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?

【问题讨论】:

    标签: flutter flutter-change-notifier


    【解决方案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
                : "",
          ),
        );
      }
    }
    

    【讨论】:

    • 它解决了这个问题。现在如何在 UserDetailsPage 的 viewmodel 中访问 UserService 的变化,并在 UserDetailsPage UI View 中反映变化?
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多