我什至使用了状态管理 - notifyListeners() 什么都不做
Did I even use state management - notifyListeners() does not do anything
我有一个简单的应用程序,它接受两个文本字段并将它们显示在另一个页面中。
这是第一个class:
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(),
)
);
}
}
然后在应用程序中 class 我有这个:
@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(),
),
);
},
)
所以按下按钮会做两件事:
- 将用户对象保存在使用 ChangeNotifier 实现的登录 class 中。
登录class如下:
class Login with ChangeNotifier {
User currentUser;
void saveUser(User user) {
currentUser = user;
// notifyListeners(); THIS LINE
}
User getUser() {
return currentUser;
}
}
按下按钮还将导航到具有以下代码的第二个页面:
Login login = Provider.of<Login>(context);
User _user = login.getUser();
然后我使用 _user 实例来显示电子邮件和密码。
代码有效,我的输入显示在第二页中。这里的问题是无论 notifyListeners() 是否被注释掉它都有效。
我什至在这里应用状态管理?
为什么不需要 notifyListeners 方法?
供应商模型的工作原理是:
- 它 呈现特定小部件的设计 (在您的情况下为 App() 小部件) 使用您最初拥有的数据ChangeNotifer class (在你的情况下登录 class).
- 如果 ChangeNotifier class 中的任何值发生变化并且您知道此更改将影响设计,例如-让我们说在按钮上按下 u增加您在小部件中显示的计数器变量。所以你知道如果计数器变量的值发生变化,设计必须更新。如果是这种情况,即需要用值更新设计,然后调用 notifyListeners() 它将根据新值更新设计。
- 如果您知道更改不会影响您的设计,则无需调用 notifyListeneres(),这在您的情况下是正确的,因为您设置了当前用户并立即推送到新屏幕因此更新先前屏幕的设计没有任何意义,即使您调用 notifyListeners() 也没关系,因为到那时您已经在新屏幕上了。
这就是您的情况,您评论的 notifyListeners() 行不会做任何值得注意的事情,并且在那里有点无用。
但这并不意味着您没有使用状态管理,您使用它只是没有在数据更改后更新设计
我有一个简单的应用程序,它接受两个文本字段并将它们显示在另一个页面中。
这是第一个class:
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(),
)
);
}
}
然后在应用程序中 class 我有这个:
@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(),
),
);
},
)
所以按下按钮会做两件事:
- 将用户对象保存在使用 ChangeNotifier 实现的登录 class 中。
登录class如下:
class Login with ChangeNotifier {
User currentUser;
void saveUser(User user) {
currentUser = user;
// notifyListeners(); THIS LINE
}
User getUser() {
return currentUser;
}
}
按下按钮还将导航到具有以下代码的第二个页面:
Login login = Provider.of<Login>(context); User _user = login.getUser();
然后我使用 _user 实例来显示电子邮件和密码。
代码有效,我的输入显示在第二页中。这里的问题是无论 notifyListeners() 是否被注释掉它都有效。
我什至在这里应用状态管理? 为什么不需要 notifyListeners 方法?
供应商模型的工作原理是:
- 它 呈现特定小部件的设计 (在您的情况下为 App() 小部件) 使用您最初拥有的数据ChangeNotifer class (在你的情况下登录 class).
- 如果 ChangeNotifier class 中的任何值发生变化并且您知道此更改将影响设计,例如-让我们说在按钮上按下 u增加您在小部件中显示的计数器变量。所以你知道如果计数器变量的值发生变化,设计必须更新。如果是这种情况,即需要用值更新设计,然后调用 notifyListeners() 它将根据新值更新设计。
- 如果您知道更改不会影响您的设计,则无需调用 notifyListeneres(),这在您的情况下是正确的,因为您设置了当前用户并立即推送到新屏幕因此更新先前屏幕的设计没有任何意义,即使您调用 notifyListeners() 也没关系,因为到那时您已经在新屏幕上了。
这就是您的情况,您评论的 notifyListeners() 行不会做任何值得注意的事情,并且在那里有点无用。
但这并不意味着您没有使用状态管理,您使用它只是没有在数据更改后更新设计