【问题标题】:Flutter: How to display a floatingActionButton only after the FutureBuilder endsFlutter:如何仅在 FutureBuilder 结束后显示浮动操作按钮
【发布时间】:2020-12-05 17:01:16
【问题描述】:

我希望仅在我未来加载数据 (ConnectionState.done) 后显示一个 floatingActionButton。

它只是在等待期间显示,并不酷。我希望它在未来处理后显示(ConnectionState.done)。

有人给小费吗?

我的代码:

 @override
  void initState() {
    _future = getFuture();
    super.initState();
  }

  Future<List<Associated>> getFuture() async {
    return _webClient.findAll();
  }

 //@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<Associated>>(

        future: _future, 

        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              break;
            case ConnectionState.waiting:
              return Progress();
              break;
            case ConnectionState.active:
              break;
              case ConnectionState.done:
               if (snapshot.hasData) {
                final List<Associated> associateds = snapshot.data;
                if (associateds.isNotEmpty) {
                  return Container(

                    child: Form(
                      child: SingleChildScrollView(
                        child: associatedWidgets(associateds),
                      ),
                    ),
                  );
                }
              }
              return CenteredMessage(
                'Not found.',
                icon: Icons.warning,
              );
              break;
          }

        },
      ),
      floatingActionButton: Button(
        Icons.save,
        onClick: () {
          _update(context);
        },
      ),
    );
  }

【问题讨论】:

    标签: flutter flutter-futurebuilder


    【解决方案1】:

    据我了解你的问题,我想回答一下。
    像这样简单。

    另外,我们不应该在 FutureBuilder 中调用 setState()

    所以,考虑到这种情况,我们可以做这样的事情。
    定义一个变量bool isLoading = true;

    @override
      void initState() {
        getFuture().then((value){
            setState(() { 
              _future = value;
              isLoading = false;
            });
        }).catch((e) {
         // Some Error Handling
        });
        super.initState();
      }
    

    在分配FloatingActionButton 时,请执行以下操作。

      floatingActionButton: isLoading? null : Button(
            Icons.save,
            onClick: () {
              _update(context);
            },
          ),
    

    但在这种情况下,您必须使用其他FutureBuilder 的小部件,就像这样。

    Scaffold(
       body: isLoading ? Progress(): ListView()
    );
    

    提示:您可以将FloatingActionButton 小部件与onPressed 一起使用,而不是Button

    【讨论】:

    • 这个语句 setState(() { isLoading = false; });导致错误:
    • 是的,我想通了,我们不能在FutureBuilder 中使用setState()。我提出了另一个想法。看看它是否适合您的情况。
    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 2016-09-29
    • 2021-01-27
    • 2016-11-09
    • 2020-03-25
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多