提供程序中的状态更改时小部件不会重建
Widgets don't rebuild when state changes in provider
我正在寻找的是 BottomNavigationBarItem
在用户登录应用程序时发生变化。我为此创建了一个提供者服务。
class UserData with ChangeNotifier, DiagnosticableTreeMixin {
bool _isLoggedin = false;
bool get isLoggedin => _isLoggedin;
UserData() {
print('UserData Provider is summoned!');
loginState();
}
void loginStateSetter(bool val) {
this._isLoggedin = val;
print("Login State changed to ${this._isLoggedin}");
notifyListeners();
}
void loginState() async {
this._isLoggedin = await wooCommerceCredentials.isCustomerLoggedIn();
print('loginState() func called. login state is ${this._isLoggedin}');
notifyListeners();
}
}
根据我在调试控制台上看到的,记录过程没有问题和错误。每次成功登录后,我使用 loginStateSetter
函数设置 _isLoggedin
值。 (这也成功发生了。)
但我面临的问题是小部件不会自行重建。我不明白为什么。 provider 里面的值改成功了,难道不应该重建widgets吗? bottomNavigationBar
小部件中的代码:
Provider.of<UserData>(context).isLoggedin
? BottomNavigationBarItem(
activeIcon: Icon(Icons.account_circle),
icon: Icon(Icons.account_circle_outlined),
label: 'Profile',
)
: BottomNavigationBarItem(
activeIcon: Icon(Icons.account_circle),
icon: Icon(Icons.account_circle_outlined),
label: 'Login/Sign up',
),
注意:登录发生在另一个页面内,其中提供者已在抽屉内像这样被召唤:
ListTile(
leading: Icon(Icons.account_circle_outlined),
title: Text('Login / Sign Up',
style: TextStyle(fontWeight: FontWeight.normal)),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeNotifierProvider(
child: LoginPage(), create: (_) => UserData())),
);
},
),
我应该改变什么?我试过使用 StreamBuilder
等(在按钮菜单外),但是在我热重启之前小部件不会重建。我做错了什么?
问题是由两次调用提供商引起的。从小部件树中删除第二个提供程序后,它开始按预期重建小部件。
我正在寻找的是 BottomNavigationBarItem
在用户登录应用程序时发生变化。我为此创建了一个提供者服务。
class UserData with ChangeNotifier, DiagnosticableTreeMixin {
bool _isLoggedin = false;
bool get isLoggedin => _isLoggedin;
UserData() {
print('UserData Provider is summoned!');
loginState();
}
void loginStateSetter(bool val) {
this._isLoggedin = val;
print("Login State changed to ${this._isLoggedin}");
notifyListeners();
}
void loginState() async {
this._isLoggedin = await wooCommerceCredentials.isCustomerLoggedIn();
print('loginState() func called. login state is ${this._isLoggedin}');
notifyListeners();
}
}
根据我在调试控制台上看到的,记录过程没有问题和错误。每次成功登录后,我使用 loginStateSetter
函数设置 _isLoggedin
值。 (这也成功发生了。)
但我面临的问题是小部件不会自行重建。我不明白为什么。 provider 里面的值改成功了,难道不应该重建widgets吗? bottomNavigationBar
小部件中的代码:
Provider.of<UserData>(context).isLoggedin
? BottomNavigationBarItem(
activeIcon: Icon(Icons.account_circle),
icon: Icon(Icons.account_circle_outlined),
label: 'Profile',
)
: BottomNavigationBarItem(
activeIcon: Icon(Icons.account_circle),
icon: Icon(Icons.account_circle_outlined),
label: 'Login/Sign up',
),
注意:登录发生在另一个页面内,其中提供者已在抽屉内像这样被召唤:
ListTile(
leading: Icon(Icons.account_circle_outlined),
title: Text('Login / Sign Up',
style: TextStyle(fontWeight: FontWeight.normal)),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeNotifierProvider(
child: LoginPage(), create: (_) => UserData())),
);
},
),
我应该改变什么?我试过使用 StreamBuilder
等(在按钮菜单外),但是在我热重启之前小部件不会重建。我做错了什么?
问题是由两次调用提供商引起的。从小部件树中删除第二个提供程序后,它开始按预期重建小部件。