【问题标题】:How to Reload Flutter StatefulWidget with AutomaticKeepAliveClientMixin?如何使用 AutomaticKeepAliveClientMixin 重新加载 Flutter StatefulWidget?
【发布时间】:2021-04-08 16:13:56
【问题描述】:

如何使用 AutomaticKeepAliveClientMixin 重新加载 Flutter StatefulWidget?

以下代码不会在用户通过 firebase 注销时重新加载 Usermovies 列表 StreamBuilder,而是仅显示旧用户电影数据。

此 HomeScreen 在底部导航栏中使用 PageView 调用。另一个页面是带有登录和注销按钮的 AccountScreen。

我的问题是如何通过 firebase 在用户注销时重新加载 UserMovies。如何在从 AccountScreen 注销时重新加载 HomeScreen,以便将用户电影流刷新为 null。

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen>
    with AutomaticKeepAliveClientMixin {

  @override
  bool get wantKeepAlive => true;


@override
  Widget build(BuildContext context) {
    // need to call super method for AutomaticKeepAliveClientMixin
    super.build(context);

    print('Rebuild in Home Screen.....');

    return StreamBuilder<app.User>(
          stream: Provider.of<AuthProvider>(context, listen: true).user,
          builder: (context, snapshot) {
            if (snapshot.data != null) {
              isUserLoggedIn = true;
              rebuild = false;
            } else if (snapshot.data == null && isUserLoggedIn) {
              isUserLoggedIn = false;
              rebuild = true;
            } else {
              isUserLoggedIn = false;
              rebuild = false;
            }

            if (rebuild) {
              // Not reloading the Usermovies on user logout, instead showing old user movies data only in the below stream builder
              Future.delayed(Duration.zero, () => setState(() {}));
              
            }
        return StreamBuilder<List<UserMovies>>(
            stream: Provider.of<UserDetailsProvider>(context,
                    listen: false)
                    .getUserFavouriteMovies(),
            builder: (context, snapshot) {
                    snapshot.data != null && snapshot.data.length > 0
                    ? print('data there: ')
                    : print('data zero');

                    snapshot.data != null && snapshot.data.length > 0
                    ? Scaffold.of(context).showCurrentSnackBar() // to show last favourite movie
                    : Scaffold.of(context).hideCurrentSnackBar();

                   return SizedBox(height: 2.0);
             },
         },
      ),
   }
}

【问题讨论】:

  • 尝试在wantKeepAlive 返回false 时调用setState
  • 如果 wantKeepAlive => false,那么每次访问 HomeScreen 时都会重新加载。我希望仅在用户注销时重新加载屏幕。
  • 好的,谢谢,你能告诉我如何在用户注销时设置wantKeepAlive => false。

标签: flutter flutter-bottomnavigation


【解决方案1】:

返回对用户是否存在的检查

@override
bool get wantKeepAlive => isUserLoggedIn;;

在同一个类中监听您的用户流,并跟踪用户是否存在并在此基础上设置isUserLoggedIn,如果用户不存在,则现在将保持状态。

initState(){
 Provider.of<AuthProvider>(context, listen: true).user.listen((user){
  isUserLoggedIn = user!=null;
 });
}

这里wantKeepAlive是一个框架getter方法,由flutter框架(mixin)用来决定是否必须维护状态,你可以根据你的需要返回一个动态的布尔值。

【讨论】:

  • 好的,谢谢,你能告诉我如何在用户退出时设置wantKeepAlive => false
  • 以上代码根据用户存在动态判断wantKeepAlive是真还是假
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2020-06-07
  • 2018-07-06
  • 1970-01-01
  • 2020-02-25
  • 2020-10-01
相关资源
最近更新 更多