我如何避免 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}');
        }
      },
    ),
    );
  }
}