【问题标题】:flutter infinite scrolling data from server in listview builder在列表视图构建器中从服务器抖动无限滚动数据
【发布时间】:2021-12-24 17:54:25
【问题描述】:

我正在使用graphql_flutter 从服务器加载数据,我应该为服务器中的更新页面更新 moreId 并获取更多要加载的数据,我需要为此使用无限。

我该怎么做?

class MoreEpd extends StatefulWidget {
      final String moreId;
      const MoreEpd({Key? key, required this.moreId}) : super(key: key);
    
      @override
      _MoreEpdState createState() => _MoreEpdState();
    }
    
    class _MoreEpdState extends State<MoreEpd> {
      double pageWidth = 0;
      double pageHeigh = 0;
      int pageNum = 0;
    
      final String leftArrow = 'assets/icons/left-arrow.svg';
      String getSearchResult = """
     query homeview(\$moreId: ID!, \$page: Int! ){
        homeview(HM_ID: \$moreId, page: \$page){
        HM_ID
        HM_Type_ID
        HM_Type_Name
        HM_NAME
        Priority
        Details{
          HM_Det_ID
          HM_ID
          Ep_ID
          Pod_ID
          Link
          Image
          title
          Pod_title
          
        }
      }
    }
    """;
    
      @override
      Widget build(BuildContext context) {
        pageWidth = MediaQuery.of(context).size.width;
        pageHeigh = MediaQuery.of(context).size.height;
        return Container(
          child: Query(
            options: QueryOptions(
              document: gql(getSearchResult),
              variables: {'moreId': widget.moreId, 'page': pageNum},
            ),
            builder: (
              QueryResult result, {
              Refetch? refetch,
              FetchMore? fetchMore,
            }) {
              return handleResult(result);
            },
          ),
        );
      }
     Widget handleResult(QueryResult result) {
        var data = result.data!['homeview']['Details'] ?? [];
    
        return Container(
            child: ListView.builder(
                padding: EdgeInsets.only(top: 15),
                shrinkWrap: true,
                itemCount: data.length ,
                itemBuilder: (context, index) {
                  return InkWell(
                    onTap: () {},
                    child: Padding(
                      padding: EdgeInsets.only(
                          top: pageWidth * 0.0,
                          right: pageWidth * 0.08,
                          left: pageWidth * 0.08,
                          bottom: pageWidth * 0.0),
                      child: Container(
                        child: Stack(
                          children: [
                            Column(
                              children: [
                                Padding(
                                  padding:
                                      EdgeInsets.only(bottom: pageWidth * 0.060),
                                  child: Row(
                                    children: [
                                      Padding(
                                        padding:
                                            EdgeInsets.only(left: pageWidth * 0.01),
                                        child: Container(
                                          // alignment: Alignment.centerRight,
                                          width: pageWidth * 0.128,
                                          height: pageWidth * 0.128,
                                          decoration: BoxDecoration(
                                              image: DecorationImage(
                                                  fit: BoxFit.cover,
                                                  image: CachedNetworkImageProvider(
                                                    data[index]['Image'],
                                                  )),
                                              borderRadius: BorderRadius.all(
                                                  Radius.circular(15)),
                                              // color: Colors.redAccent,
                                              border: Border.all(
                                                color: MyColors.lightGrey,
                                                width: 1,
                                              )),
                                        ),
                                      ),
                                      Expanded(
                                        child: Row(
                                          children: [
                                            Column(
                                              crossAxisAlignment:
                                                  CrossAxisAlignment.start,
                                              children: [
                                                Container(
                                                  width: pageWidth * 0.5,
                                                  alignment: Alignment.centerRight,
                                                  child: Text(
                                                    data[index]['title'],
                                                    textAlign: TextAlign.right,
                                                    overflow: TextOverflow.ellipsis,
                                                    maxLines: 1,
                                                    // softWrap: true,
                                                    style: TextStyle(
                                                      // fontWeight: FontWeight.bold,
                                                      fontSize: 14,
                                                    ),
                                                  ),
                                                ),
                                              ],
                                            ),
                                          ],
                                        ),
                                      )
                                    ],
                                  ),
                                ),
                              ],
                            ),
                          ],
                        ),
                      ),
                    ),
                  );
                }));
      }
    }

【问题讨论】:

    标签: flutter dart graphql infinite-scroll


    【解决方案1】:

    第一个错误是由于没有处理Query 的状态而发生的。为了做到这一点builder:

    删除州级数据var data = [];

         builder: (
                    QueryResult result, {
                    Refetch? refetch,
                    FetchMore? fetchMore,
                  }) {
                    if (result.hasException) {
                      return Text(result.exception.toString());
                    }
                    if (result.isLoading) {
                      return Column(
                        children: [
                          Expanded(
                              child: handleResult(data)), // show data while loading
                          const Center(
                            child: CircularProgressIndicator(),
                          ),
                        ],
                      );
                    }
                    data.addAll(result.data!['homeview']['Details'] ?? []);
                    return handleResult(data);
                  },
    

    我们现在需要增加pageNum 以获取更多数据。我正在使用加载更多按钮,最好通过增加 itemLength+=1 来创建列表末尾的加载按钮。

    更新使用ScrollController

    // on state class
      final ScrollController controller = ScrollController();
      bool isLoading = false;
    

    在滚动时加载数据

      @override
      void initState() {
        super.initState();
        controller.addListener(() {
          /// load date at when scroll reached -100
          if (controller.position.pixels >
              controller.position.maxScrollExtent - 100) {
            print("Scroll on loading");
            if (!isLoading) {
              print("fetching");
              setState(() {
                pageNum++;
                isLoading = true;
              });
            }
          }
        });
      }
    

    完整片段on Gist

    关于职位问题,可以查看this

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多