Flutter使用initState初始化Future后筛选功能失效的问题求助
Flutter使用initState初始化Future后筛选功能失效的问题求助
我完全懂你的困扰!之前直接把getRecipes()塞进FutureBuilder的future参数里时,筛选功能好好的,结果按照文档推荐移到initState里初始化Future之后,点筛选按钮更新条件,列表完全没反应了对吧?
别着急,我看了你的代码,问题根源很明确:
问题出在哪?
你在initState里只给futureRecipe赋值了一次——用的是初始的空字符串筛选条件。initState是组件刚创建时才会执行的生命周期函数,这辈子只跑一次!
之后你点击筛选按钮调用_updateFilterText,虽然通过setState更新了mealTypeFilter,但futureRecipe这个变量根本没变化,还是绑定着第一次请求的旧Future。FutureBuilder只会监听它一开始绑定的那个Future,自然不会去拿新的筛选数据。
怎么修复?
只需要修改_updateFilterText方法,在更新筛选条件的同时,重新发起请求并更新futureRecipe就行:
void _updateFilterText(val) { print(val); setState(() { mealTypeFilter = val; // 关键:带着新的筛选条件重新请求数据,更新futureRecipe futureRecipe = RecipeDataService().getRecipes(mealTypeFilter); }); }
这样每次点击筛选按钮,都会用新的条件重新调用接口,futureRecipe变成新的Future后,FutureBuilder会自动监听这个新的Future,等待新数据返回后刷新列表,筛选功能就恢复正常啦!
额外小提醒
如果担心用户频繁点筛选按钮导致重复发请求,可以加个简单的防抖逻辑(比如延迟300ms再发起请求,期间重复点击就重置延迟),不过先解决当前核心问题的话,上面的修改就足够用了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

