0

我有一个简单的应用程序,它需要两个文本字段并将它们显示在另一个页面中。

这是第一堂课:

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => Login(),
      child: MaterialApp(
        color: Colors.teal,
        home: App(),
      )
    );
  }
}

然后在 App 类中我有这个:

@override
  Widget build(BuildContext context) {
    Login log = Provider.of<Login>(context);
.
.
.
.
// textfields that take email and password inputs
.
.
                FlatButton(
                  color: Colors.white,
                  child: Text('Save', style: GoogleFonts.pacifico()),
                  onPressed: () {
                    log.saveUser(  // THIS METHOD
                        User(emailController.text, passwordController.text));
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => ShowUser(),
                      ),
                    );
                  },
                )

所以按下按钮会做两件事:

  1. 将 User 对象保存在用 ChangeNotifier 实现的 Login 类中。

登录类如下:

class Login with ChangeNotifier {



 User currentUser;

  void saveUser(User user) {
    currentUser = user;

    // notifyListeners();  THIS LINE
  }

  User getUser() {
    return currentUser;
  }
}
  1. 按下按钮还将导航到具有以下代码的第二页:

    Login login = Provider.of<Login>(context);
    User _user = login.getUser();
    

然后我使用 _user 实例来显示电子邮件和密码。

代码有效,我的输入显示在第二页。这里的问题是 notifyListeners() 是否被注释掉。

我什至在这里应用状态管理?为什么不需要 notifyListeners 方法?

在此处输入图像描述

4

1 回答 1

1

那么提供者模型的工作原理是:

  1. 它使用您最初在 ChangeNotifer 类(在您的情况下为 Login 类)中拥有的数据呈现特定小部件(在您的情况下为 App() 小部件)的设计。
  2. 如果 ChangeNotifier 类中的任何值发生更改,并且您知道此更改将影响设计,例如,假设按下按钮,您会增加您在小部件中显示的计数器变量。所以你知道如果计数器变量的值发生变化,设计就必须更新。如果是这种情况,即设计需要使用值更新,那么您调用 notifyListeners() 它将更新与新值对应的设计。
  3. 如果您知道更改不会影响您的设计,则无需调用 notifyListeneres()在您的情况下这是正确的,因为您设置了当前用户并立即推送到新屏幕,因此更新前一个屏幕的设计没有任何意义,甚至如果你调用 notifyListeners() 没关系,因为到那时你已经在新屏幕上。

所以这就是你的情况发生的事情,你评论的notifyListeners()行不会做任何值得注意的事情,并且在那里有点没用。

但这并不意味着您没有使用状态管理,您使用它只是没有在数据更改后更新设计

于 2020-06-11T15:45:08.063 回答