我如何避免 FutureBuilder 运行多次并复制输出列表
how I avoid FutureBuilder runs multiple times and duplicate the output List
我有一个 returns 列表的 Future 函数,我遇到了不断重复的问题...我通过设置 initState() 解决了这个问题,如下所述: flutter-futurebuilder -不断被调用
现在我需要在按下按钮时执行 Future 函数,为此我创建了一个列表,在按下按钮时将 FutureBuilder 添加到该列表,但我删除了 initState()。
所以现在重复问题又回来了...
有谁知道我如何在按下按钮时让 FutureBuilder 运行 只执行一次?
我无法附上代码,因为它太长太复杂,我希望我足够清楚并且有人可以帮助我。谢谢:)
您好,也许您可以查看下面的示例代码
class _MyHomePageState extends State<MyHomePage> {
List<String> _myList = [];
bool isLoading = false;
setLoading()=>setState(()=>isLoading = !isLoading);
Future<void> _myFunction()async{
setLoading();
await Future.delayed(const Duration(seconds:1));
_myList.add("Some Text");
setLoading();
}
@override
initState(){
_myFunction();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
children: [
const Text('Your List:'),
..._myList.map((e)=> Text(e)),
if(isLoading) const CircularProgressIndicator()
],
),
),
floatingActionButton: FloatingActionButton(
onPressed:()=> _myFunction(),
child: const Icon(Icons.add),
),
);
}
}
那个方法永远不会每次都调用函数。只有在创建页面 initState()
时才调用,否则不会 Flutter FutureBuilder Constantly Called
谢谢
class _MyHomePageState extends State<MyHomePage> {
Future<List<DataModal>> getFuture;
@override
void initState() {
super.initState();
getFuture = fetchData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: FutureBuilder<List<PostModalClass>>(
future: getFuture,
builder: (BuildContext context,
AsyncSnapshot<List<PostModalClass>>snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting: return Text('Loading....');
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else
return Text('Result: ${snapshot.data}');
}
},
),
);
}
}
我有一个 returns 列表的 Future 函数,我遇到了不断重复的问题...我通过设置 initState() 解决了这个问题,如下所述:
现在我需要在按下按钮时执行 Future 函数,为此我创建了一个列表,在按下按钮时将 FutureBuilder 添加到该列表,但我删除了 initState()。
所以现在重复问题又回来了...
有谁知道我如何在按下按钮时让 FutureBuilder 运行 只执行一次?
我无法附上代码,因为它太长太复杂,我希望我足够清楚并且有人可以帮助我。谢谢:)
您好,也许您可以查看下面的示例代码
class _MyHomePageState extends State<MyHomePage> {
List<String> _myList = [];
bool isLoading = false;
setLoading()=>setState(()=>isLoading = !isLoading);
Future<void> _myFunction()async{
setLoading();
await Future.delayed(const Duration(seconds:1));
_myList.add("Some Text");
setLoading();
}
@override
initState(){
_myFunction();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
children: [
const Text('Your List:'),
..._myList.map((e)=> Text(e)),
if(isLoading) const CircularProgressIndicator()
],
),
),
floatingActionButton: FloatingActionButton(
onPressed:()=> _myFunction(),
child: const Icon(Icons.add),
),
);
}
}
那个方法永远不会每次都调用函数。只有在创建页面 initState()
时才调用,否则不会 Flutter FutureBuilder Constantly Called
谢谢
class _MyHomePageState extends State<MyHomePage> {
Future<List<DataModal>> getFuture;
@override
void initState() {
super.initState();
getFuture = fetchData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: FutureBuilder<List<PostModalClass>>(
future: getFuture,
builder: (BuildContext context,
AsyncSnapshot<List<PostModalClass>>snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting: return Text('Loading....');
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else
return Text('Result: ${snapshot.data}');
}
},
),
);
}
}