【问题标题】:Adding CircularProgressIndicator in infinite scroll Flutter在无限滚动 Flutter 中添加 CircularProgressIndicator
【发布时间】:2020-06-22 11:29:17
【问题描述】:

我做了无限滚动,但我想在加载列表项时添加 CircularProgressIndicator,但我做不到。那么如何根据代码添加 CircularProgressIndicator 下来:

  ListView.builder( 
    padding: EdgeInsets.symmetric(
    vertical: 10, horizontal: 10),
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
    primary: false,
    itemCount: _con.brandComplaints.length,
    itemBuilder: (context, index) {
     if (_con.isLoadingComplaints == false) {
            return Padding(
                 padding: const EdgeInsets.only(
                 bottom: 15.0),
                 child: ComplaintItemWidget(
                 complaint: _con.brandComplaints
                .elementAt(index),
                  ),
               );
    } else {
           return Center(
             child: CircularProgressIndicator());
                     }
                   },
               ),

----------------滚动列表项的滚动侦听器 ------------- ---------------------

  _scrollListener() {
    if (int.parse(_con.brand.complaintTotal) == _con.brandComplaints.length) {
      return;
    }
    //print(_scrollController.position.extentAfter);
    if (_scrollController.position.extentAfter <= 0 && isPageLoading ==false) {

      _con.listenForBrandComplaints(_con.brand.id);
    }
  }

---------------控制器------- ------------

  void listenForBrandComplaints(String idBrand) async {
    //setState(() => isLoadingComplaints = true);
    final Stream<Complaint> stream =
        await getBrandComplaints(idBrand, brandComplaints.length);
    stream.listen((Complaint _complaint) {
      setState(() => brandComplaints.add(_complaint));
    }, onError: (a) {
      //setState(() => isLoadingComplaints = false);
      print(a);
    }, onDone: () {
      //setState(() => isLoadingComplaints = false);
      //complaintOffset += brandComplaints.length;
    });
  }

【问题讨论】:

    标签: flutter infinite-scroll


    【解决方案1】:

    您可以通过使用Stack 小部件并将CircularProgressIndicatorListView 重叠来实现此目的。查看下面的代码以获取简化示例:

    class LoadingOnScroll60619794 extends StatefulWidget {
      @override
      _LoadingOnScroll60619794State createState() => _LoadingOnScroll60619794State();
    }
    
    class _LoadingOnScroll60619794State extends State<LoadingOnScroll60619794> {
      bool _loading = false;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.refresh),
                onPressed: runLoading
              ),
            ],
          ),
          body: Stack(
            children: <Widget>[
              ListView(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text('item 1'),
                  ),
                ],
              ),
              _loading
                ? Center(
                  child: CircularProgressIndicator(),
                )
                : SizedBox(width: 0, height: 0,)
            ],
          ),
        );
      }
    
      void runLoading(){
        setState(() {
          _loading = true;
        });
        Timer(Duration(milliseconds: 1500), (){
          setState(() {
            _loading = false;
          });
        });
      }
    }
    

    【讨论】:

    • 但它只有在你按下按钮时才有效,我希望当我换上加载进度指示器时会出现,直到数据被获取
    • 按下按钮只是一个例子。您只需要在获取数据时使用 setState 并将 _loading 变量设置为 true,然后在接收到数据后执行相同操作并将其传递给 false。
    • 如果答案对您有用,请将其标记为正确。还可以考虑为相关性投票。
    猜你喜欢
    • 2022-01-02
    • 2022-10-16
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多