开关颤振的未来建设者

时间:2019-11-25 04:14:28

标签: flutter dart

我有一个开关。默认情况下,开关值为true。当切换值更改时,我需要重新运行我的未来并获取新数据。但现在它没有重新运行。

这是我的方法

  Future<List<RequirementModel>> getRequirement(bool check)async{
    if(check){
      await CacheData().getUID().then((uid) {
        db.getServiceSubCategories(uid).listen((serviceSub) {
          db.getRequirements().listen((requirement) {
            ...
                  setState(() {
                    model.add(requirement[i]);
                  });
            ...
          });
        });
      });
    }else{
      await CacheData().getUID().then((uid) {
        db.getRequirements().listen((requirement) {
          ...
            setState(() {
              model.add(requirement[i]);
            });
          ...
        });
      });
    }
    return model;
  }

我在didChangeDependencies中添加了未来       未来> _未来;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    if(check){
      _future = getRequirement(check);
    }else{
      _future = getRequirement(check);
    }
  }

FutureBuilder窗口小部件

FutureBuilder<List<RequirementModel>>(
                future: _future,
                builder: (context, snapshot) {
                 if(snapshot.hasData){
                   return ListView.builder(...
                         );
                       });
                 }else{
                   return Center(
                     child: RefreshProgressIndicator(
                       backgroundColor: Palette.white,
                     ),
                   );
                 }
                }
              )

切换小部件

         Switch(
            value: check,
            onChanged: (v) {
              setState(() {
                check = v;
              });
            }),

当我这样添加时:它在不停止地重新运行。重复的问题。

 FutureBuilder<List<RequirementModel>>(
                future: getRequirement(check),

解决方案

我在答案部分下方添加了自己的解决方案。请检查并告知我,这是最佳做法吗?

1 个答案:

答案 0 :(得分:-1)

我实现了两个FutureBuilder。

 Future<List<RequirementModel>> _futureRelevant;
 Future<List<RequirementModel>> _futureAll;

还有两种方法。

  @override
  void initState() {
    super.initState();
    _futureRelevant = getRelevant();
    _futureAll = getAll();
  }

构建方法:看起来像这样:

        child: check
          ? FutureBuilder<List<RequirementModel>>(
              future: _futureRelevant,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  print(snapshot.data.length);
                  return listViewData(snapshot.data,height,width);
                }
              })
          : FutureBuilder<List<RequirementModel>>(
              future: _futureAll,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return listViewData(snapshot.data,height,width);
                }
          })