flutter - 提供程序中的状态更改时,小部件不会重建
问题描述
我正在寻找的是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();
}
}
基于我在调试控制台上看到的,日志记录过程没有问题和错误。每次成功登录后,我_isLoggedin
使用loginStateSetter
函数设置值。(这也成功地发生了。)但我面临的问题是小部件不会自行重建。我不明白为什么。provider 中的值成功更改,不应该重建小部件吗?小部件内的代码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
等(外部按钮菜单),但小部件在我热重启之前不会重建。我究竟做错了什么?
解决方案
该问题是由两次调用提供程序引起的。从小部件树中删除第二个提供者后,它开始按预期重建小部件。
推荐阅读
- excel - 尝试在过滤范围上使用偏移功能
- python - Heroku 应用程序成功部署,但在加载站点时收到应用程序错误。但我似乎可以找到一个错误
- asp.net-core - Asp.net core web-api http 基于动作的授权
- java - 如何使用线程同步方法进行如下打印?
- c# - 单击按钮-> 保存下一个用户击键
- java - 为什么我的程序只显示我的数组之一
我所有的哈希图数据中的食物而不是实际值? - rest - 具有身份验证用户令牌的 Jenkins 作业 API 不起作用
- python - ValueError: int() 以 10 为底的无效文字:'6_0'
- java - 处理 gRPC 中的异常
- node.js - 如何为 Google Cloud Function Firestore 触发器使用可重用代码?