【问题标题】:Flutter: How to show an Indicator under Gridview.count with infinity scrollFlutter:如何在无限滚动的 Gridview.count 下显示指标
【发布时间】:2020-02-09 10:36:18
【问题描述】:

我正在构建一个简单的应用程序(某种类型的博客),只使用颤振而不使用其他库。

现在,我使用GridView.count 为新帖子实现了无限滚动,一切正常,

但我需要在列表末尾有一条消息和一个指示符,告诉用户等待告诉服务器加载新内容我找不到在我的代码上实现这样的事情的方法!!

到目前为止的代码:

class _BrandsSingle extends State<BrandsSingle> {

  List phones = [];
  ScrollController _scrollController = new ScrollController();
  int pageNumber = 1;
  bool loading = false;

  Future fetchPhonesByBrand(int page) async {

    page = pageNumber;
    loading = true;

    final response = await http.get('http://192.168.1.6:3000/reviews/${widget.id}/$page');

    if (response.statusCode == 200) {

      setState(() {
        phones.addAll(jsonDecode(response.body));
        loading = false;
      });

    } else {
      // If that call was not successful, throw an error.
      throw Exception('Failed to load post');
    }

  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  void initState() {
    this.fetchPhonesByBrand(pageNumber);
    super.initState();

    _scrollController.addListener( () {
      if ( _scrollController.position.pixels == _scrollController.position.maxScrollExtent ) {
        pageNumber++;
        print(pageNumber);
        fetchPhonesByBrand(pageNumber);
      }
    });
  }

  Widget build(BuildContext context) {
    // TODO: implement build
    if ( loading == true ) {
      return Scaffold(
        appBar: AppBar(
          title: Text(widget.id),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              CircularProgressIndicator(),
              SizedBox( height: 15 ),
              Text(
                "من فضلك أنتظر قليلاً...",
                style: TextStyle(
                    fontSize: 20,
                    fontFamily: 'Mada'
                ),
              ),

            ],
          ),
        ),
      );
    }

    return Scaffold(
        appBar: AppBar(
            title: Text(
              widget.id.toUpperCase(),
              style: TextStyle(
                  letterSpacing: 2,
                  fontFamily: 'Mada'
              ),
            )
        ),
        body:  GridView.count(
          controller: _scrollController,
          crossAxisCount: 1,
          children: List.generate(
              phones.length,
                  (int index) {
                var phone = phones[index];

                return Card(
                  child: Ink.image(
                    image: NetworkImage(phone['image']),
                    child: InkWell(
                      onTap: () => Navigator.of(context).pushNamed('/phone', arguments: phone['id']),
                      child: Container(
                        decoration: BoxDecoration(
                          gradient: LinearGradient(
                            begin: Alignment.topCenter,
                            end: Alignment.bottomCenter,
                            colors: [Color.fromRGBO(0, 0, 0, 0), Color.fromRGBO(0, 0, 0, 0.7)],
                          ),
                        ),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.end,
                          children: <Widget>[
                            Padding(
                              padding: EdgeInsets.only( bottom: 10, left: 10, right: 10 ),
                              child: Center(
                                child: Text(
                                  'مواصفات ${phone['title'].toString().toUpperCase()}',
                                  style: TextStyle(
                                    fontSize: 16,
                                    fontFamily: 'Mada',
                                    letterSpacing: 2,
                                    color: Colors.white,
                                  ),
                                ),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
                );
              }
          ),
        ),
    );
  }
}

【问题讨论】:

    标签: android ios flutter dart flutter-layout


    【解决方案1】:

    您可以将加载添加为列表的最后一项:

    • List 长度应为 phones.length + 1
    • 如果index &lt;= phones.length - 1 你返回一个普通项目的Card
    • 否则,您将返回加载小部件

    您可能需要检查一些极端情况,例如:

    • 如果列表为空
    • 如果列表高度小于屏幕则不会滚动
    • 如果某些请求失败
    • 如果请求没有更多项目

    【讨论】:

    • 实际上,我尝试过这种方式并给我留下了 2 个问题,一个是指示器将始终显示在列表下方(如果我滚动则不会显示),两个指示器占用一半大小屏幕(因为 GridView)
    • 当你完成获取数据时,你可以隐藏加载,当你到达列表的末尾时,你可以再次显示它。我认为有一种方法可以根据列表的索引指定不同的 crossAxisCount,您检查过 GridView.custom() 或 GridView.builder() 及其 gridDelegate 属性吗?
    • 你有空时能给我一个示例代码吗?
    • 这几天我会准备一些东西。它将使用流,因此您可以同时尝试熟悉它,这是一个简单的示例:stackoverflow.com/questions/58292128/…
    猜你喜欢
    • 2018-04-10
    • 2022-01-02
    • 2019-07-04
    • 2021-09-07
    • 2021-08-04
    • 2022-07-07
    • 2019-04-01
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多