【问题标题】:ChangeNotifier shows error when navigate to next page导航到下一页时,ChangeNotifier 显示错误
【发布时间】:2021-04-04 15:15:43
【问题描述】:

我不熟悉使用 ChangeNotifier 和 MVVM 设计模式的提供程序构建应用程序。当登录页面加载时,我想检查它是否已经登录。如果它已经登录,则导航到下一页。但它显示以下错误。

来自初始屏幕的我的 ChangeNotifier 绑定代码

   _moveToNextScreen() async {
    await Navigator.pushReplacement(context,
        MaterialPageRoute(
            builder: (context) =>
                ChangeNotifierProvider(
                  create: (_) => LoginViewModel(),
                  child: LoginScreen(),
                ),
        ));
  }

登录屏幕代码

class _LoginScreenState extends State<LoginScreen> {
  LoginViewModel _loginViewModel;

  //controller for login
  TextEditingController _usernameController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();

  Size size; // calculate screen size

  @override
  void initState() {
    _loginViewModel = Provider.of<LoginViewModel>(context, listen: false);
    _loginViewModel.loggedInOrNot();
    checkLoginStatus();
    super.initState();
  }

  checkLoginStatus() async {
    print('vcal - ${_loginViewModel.getIsLoggedIn}');
    if (_loginViewModel.getIsLoggedIn == true) {
      //_moveToNextScreen();
    }
  }

  @override
  Widget build(BuildContext context) {
     _loginViewModel = Provider.of<LoginViewModel>(context);
    size = MediaQuery.of(context).size;

    return Scaffold(
      backgroundColor: green,
      //IP screen
      // Asset Tracker- Text
      body: _loginScreen(),
    );
  }

我的 LoginViewModel.dart

class LoginViewModel extends ChangeNotifier{

  LoginRepository _loginRepository = LoginRepository();

  bool _isLoading = false;
  bool _isLoggedIn = false;
  

  void loggedInOrNot() async {
    _isLoggedIn =  !_isLoggedIn;
    //await _loginRepository.checkToken();
    notifyListeners();
  }

  bool get getIsLoggedIn => _isLoggedIn;
  bool get getIsLoading => _isLoading;

}

我该如何解决这个问题?

【问题讨论】:

  • 我认为你必须在那里使用ChangeNotifierProvider.valueProxyProvider 但我建议在那里使用_loginViewModel.getIsLoggedIn?page1:page2 之类的条件
  • 如果我调用 _loginViewModel.getIsLoggedIn 它返回 false。它不检查loggedInorNot。我如何分配 _isLoadedIn 的值来等待返回 bool 值的 _loginRepository.checkToken()。
  • 你应该在你的登录仓库中使用 provider 我想我发现这段代码可能会有所帮助github.com/itsatifsiddiqui/providerLogin/blob/master/lib/model/…

标签: flutter dart mvvm provider


【解决方案1】:

您应该访问这样的提供程序

Provider.of<LoginViewModel>(context, listen: false).getIsLoggedIn;

并使用 ui 类小部件树顶部的 Consumer 小部件包装

消费者会在每次状态变化时重建你的 UI。

有关提供者和消费者的更多信息,我建议您查看他们的文档,找到它from here

【讨论】:

  • 我可以获得文档链接吗?
  • Provider.of(context, listen: false).getIsLoggedIn 这个值总是假的。如何将其值分配给 await _loginRepository.checkToken() 返回 bool 值。我不想调用 lloggedInOrNot() 来更新 isLoggedIn 值。
  • 检查用户登录? U 将其值设置为 true 或 false,然后 notifyListners 方法会通知您应用中的所有侦听器。您的 ui 您首先检查 isLoading 是否为真,如果为假则显示加载屏幕您可以检查用户登录与否!
【解决方案2】:

这可能是因为当您转到下一页时,您创建了 new ChangeNotifierProvider。您必须将它放在这两个小部件之上,例如以上MaterialApp/CupertinoApp

【讨论】:

  • 我有 3 个带有更改通知器的 ViewModel。如何为不同的视图添加 ViewModel?
  • 例如你有 Widget1, Widget2, Widget3, Widget4。 Widget2 和 Widget3 是 Widget1 的继承者, Widget4 是 Widget3 的继承者。如果您将 Provider 放在 Widget1 上方,您也可以在 Widget2、Widget3 和 Widget 4 中使用它。如果不是您的问题,请写信给我
  • 如果我将更改通知器与多个提供商一起放置,那么我可以在任何屏幕中使用我的 LoginViewModel。我说的对吗?
  • 是的,在您的多提供商下的任何小部件中
猜你喜欢
  • 2021-07-08
  • 2012-11-27
  • 1970-01-01
  • 2016-11-02
  • 2020-03-17
  • 1970-01-01
  • 2017-11-16
  • 2019-12-11
  • 1970-01-01
相关资源
最近更新 更多