【问题标题】:How to perform lazy loading or infinity loading in flutter?如何在颤振中执行延迟加载或无限加载?
【发布时间】:2020-06-23 07:07:37
【问题描述】:

我正在尝试通过颤振获得延迟加载输出。我只能使用颤振给出的生成数组作为示例进行延迟加载。但是在与 Rest API 集成时,我无法获得相同的输出。如何在 Flutter 中使用 API 执行延迟加载?

【问题讨论】:

    标签: django flutter flutter-layout rest


    【解决方案1】:

    我用分页调用 api, 这是我的代码:

    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    
    class TestLazyLoading extends StatefulWidget {
      @override
      _TestLazyLoadingState createState() => new _TestLazyLoadingState();
    }
    
    class _TestLazyLoadingState extends State<TestLazyLoading> {
      static const String _url = 'https://api.coinranking.com/v1/public/coins';
      ScrollController controller;
      int _totalCount = 0;
      int _limit = 20;
      int _offset = 0;
      List<String> items = [];
      bool _isLoading = true;
    
      @override
      void initState() {
        super.initState();
        controller = new ScrollController()..addListener(_scrollListener);
        _getData(limit: _limit, offset: _offset);
      }
    
      @override
      void dispose() {
        controller.removeListener(_scrollListener);
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            body: Scrollbar(
              child: ListView.builder(
                controller: controller,
                itemBuilder: (context, index) {
                  if (items.length-1 == index && _isLoading ) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  } else {
                    return Container(
                      child: Text(items[index]),
                      height: 38,
                      alignment: Alignment.centerLeft,
                      margin: EdgeInsets.all(5),
                      padding: EdgeInsets.all(10),
                      color: Colors.grey[200],
                    );
                  }
                },
                itemCount: items.length,
              ),
            ),
          ),
        );
      }
    
      void _scrollListener() {
        if (controller.position.extentAfter < 50) {
          if (!_isLoading && _totalCount > items.length) {
            _offset += _limit;
            _getData(limit: _limit, offset: _offset);
          }
        }
      }
    
      void _getData({@required int limit, @required int offset}) async {
    
        setState(() {
          _isLoading = true;
        });
    
        http.Response response =
            await http.get('$_url?limit=$limit&offset=$offset');
        if (response.statusCode == 200) {
          var jsonResponse = jsonDecode(response.body);
          _totalCount = jsonResponse['data']['stats']['total'];
          List<dynamic> coinList = jsonResponse['data']['coins'];
          for (dynamic coin in coinList) {
            items.add(coin['symbol']);
          }
          setState(() {
            _isLoading = false;
          });
        }
      }
    }
    

    还在 pubspec.yaml 中添加对 http 的依赖:

    dev_dependencies:
      flutter_test:
        sdk: flutter
      http: ^0.12.1
    

    最终在 main 中调用 TestLazyLoading 小部件进行测试

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 2022-08-18
      • 2012-01-15
      • 2011-01-11
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多