颤动-避免整个小部件重建

时间:2020-06-27 19:41:19

标签: flutter dart google-cloud-firestore async-await widget

尝试在“未来”构建器中使用“喜欢的按钮”以及下面的许多其他小部件, enter image description here

onPressed: () {
    if (aleadyLiked.length > 0) {
        unlike(profileId);
     } else {
        like(profileId);
     }
   setState(() {});
 },

这就是我未来的构建者的开始方式,

@override
Widget build(BuildContext context) {
return FutureBuilder(
  future: getProfile(profileId), 
  builder: (context, snapshot) {
  =======Other widgets here======
  }

问题 on按下了类似的图标按钮,我正在执行setState(),这将导致整个Future构建器重新加载,是否有一种方法可以更新Like按钮和Like计数,我当时在考虑使用一些客户端计数器逻辑来回调实际的数据库更新。请帮忙。

可以实现initState()上的加载配置文件部分,但是如何处理更新和反映“喜欢”,是否可以仅重新加载“喜欢”按钮区域?

2 个答案:

答案 0 :(得分:0)

您不应该这样获得用户配置文件,但是您可以做的是,您可以在initState中获取用户配置文件,并且在不加载数据之前,您可以显示任何内容的加载器。

类似这样的事情...

  User _user;
  
  Future<User> getUserProfile(profileId) async{
    ///Todo : Implementation of get User Profile
  }
  
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getUserProfile("userId").then((user){
      setState(() {
        _user =user;
      });
    })
  }

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: this._user == null ? CircularProgressIndicator() : UserWidget(),
    );
  }

答案 1 :(得分:0)

这就是我最终实现它的方式,

void initState() {
 getProfile(profileId).then((user){
  setState(() {
    _profile =user;
    _counter =_profile.profilelikes.length;
    _isAlreadyLiked=_profile.allreadyliked.length > 0;
  });
 });
 super.initState();
}

而OnPressed()是

                                                            onPressed: () {
                                                              if (_isAlreadyLiked) {
                                                                unlike(profileId);
                                                                setState(() {
                                                                  _counter--;
                                                                  _isAlreadyLiked=false;
                                                                });
                                                              } else {
                                                                like(profileId);
                                                                setState(() {
                                                                  _counter++;
                                                                  _isAlreadyLiked=true;
                                                                });
                                                              }
                                                            },

缺点:其他用户的喜欢只会在Wiget重新加载上体现出来,暂时对我来说还可以。