首页 > 解决方案 > 提供程序中的状态更改时,小部件不会重建

问题描述

我正在寻找的是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等(外部按钮菜单),但小部件在我热重启之前不会重建。我究竟做错了什么?

标签: flutterflutter-provider

解决方案


该问题是由两次调用提供程序引起的。从小部件树中删除第二个提供者后,它开始按预期重建小部件。


推荐阅读