簡體   English   中英

Flutter:SliverList 內的 ListView 生成器

[英]Flutter: ListView Builder inside SliverList

我正在嘗試在 Listbox Builder 中使用 Flutter EasyRefresh 插件。 https://pub.dev/packages/flutter_easyrefresh

早些時候,我使用 Scroll Controller 加載更多 function 並且它工作但現在我決定添加下拉刷新。

我的代碼很長,但我試圖將這個問題縮小。

Future <List> getData() async{ 
   if(endofrecord == false){
    try{  
      var deviceid = '1234';
      var uid = '999';

  
  var bodyss = { "uid" : id, "deviceid": deviceid, "offset": offset};
  var url = 'http://192.168.100.4:8080/get-followerdata.php';

                // Starting Web API Call.
       var response = await http.post(url, body: json.encode(bodyss)).timeout(Duration(seconds: 5),
        onTimeout: (){
                //  throw Exception();
                  //or you can also
          return null;
        });
     if(response.statusCode == 200){
       final data = getFollowingFromJson(response.body);
                  setState(() {
                    _inProcess = false;
                    if(data.count == null){
                      count = 0;
                    }else{
                      offset = offset + 1;
                      print(offset);
                      count = data.count;
                    }
                  if(data.content.length > 0 && data.content[0].name != 'Empty'){
                    for (var i in data.content) {
                      lists.add(i);
                    }  
                  }else{
                    nodata = 'No Record Found';
                    endofrecord = true;
                  }
                
                  });
            print(lists.length);
            
     }
 
}catch(e){
   print("Exception Caught: $e");
}

 return lists;
    }
  } 

這是與代碼相關的其他小部件。

body: EasyRefresh.custom(
          enableControlFinishRefresh: false,
          enableControlFinishLoad: true,
          controller: _controllers,
          header: ClassicalHeader(),
          footer: ClassicalFooter(),
          onRefresh: () async {
            await Future.delayed(Duration(seconds: 2), () {
              print('onRefresh');
              setState(() {
                _count = 2;
                getData();
              });
              _controllers.resetLoadState();
            });
          },
          onLoad: () async {
            await Future.delayed(Duration(seconds: 2), () {
              print('onLoad');
              setState(() {
                _count += 2;
                getData();
              });
              _controllers.finishLoad(noMore: _count >= 4);
            });
          },
       
         slivers: <Widget>[
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (context, index) {
        return Container(
        //child: Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: Stack(
            children: <Widget>[
        TabBarView(
          controller: _controller,
          children: [
           // Text("TAB ONE CONTENT"),
           Container(
                decoration: BoxDecoration(
                 // borderRadius: BorderRadius.circular(25),
                  color: Colors.black87,
                ),
                padding: EdgeInsets.only(top: 10, bottom: 5),
                height: MediaQuery.of(context).size.height,
                width: double.infinity,
                child: ListView.builder(
                   // controller: _scrollcontroller,
                    itemCount: lists.length, 
                    itemBuilder: (BuildContext context, int index) {
                      return buildList1(context, index);
                    }),
              ),

在 Listview.builder 中加載數據后,onRefresh 或 onload function 不會觸發。 簡而言之,一旦數據加載 onRefresh 或 on load 就不會發生。 如果我沒有加載數據,那么我可以看到加載並下拉刷新正在觸發。

編輯:我發現 onRefresh 正在觸發,但我需要將它拖到屏幕頂部。 如果我從中心或底部拖動,則它不會觸發。 用簡單的話來說,只要有一個列表視圖項目,它就不會觸發。

編輯 2

我懷疑以下代碼中的問題。

 return Container(
        //child: Container(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width,
          child: Stack(
            children: <Widget>[
        TabBarView(
          controller: _controller,
          children: [
           // Text("TAB ONE CONTENT"),

也許我沒有正確使用它。

您需要等待 getData(),而不是等待延遲 2 秒。 未來完成后,您應該更改小部件的 state

您的代碼應該類似於:

  1. 等待獲取數據();
  2. 更新 state

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM