Flutter: построитель ListView внутри SliverList - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь использовать плагин Flutter EasyRefre sh в Listbox Builder. https://pub.dev/packages/flutter_easyrefresh

Раньше я использовал контроллер прокрутки для загрузки дополнительных функций, и это работало, но теперь я решил добавить опускание в refre sh.

My код довольно длинный, но я пытаюсь уменьшить его для этого вопроса.

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 onRefre sh или функция onload не сработала. Проще говоря, после загрузки данных по ссылке sh или загрузки не произошло. Если я не загружал данные, я могу видеть при загрузке и опускаться до refre. sh запускается.

Edit: Я обнаружил, что onRefre sh запускается, но я нужно перетащить его в верхнюю часть экрана. Если я тяну от центра или низа, огонь не стреляет. Простыми словами, везде, где есть элемент списка, он не срабатывает.

Редактировать 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"),

Может, я неправильно его использую.

1 Ответ

0 голосов
/ 17 июня 2020

Вам нужно ждать getData () вместо await с задержкой 2 секунды. Как только будущее завершится, вы должны изменить состояние вашего виджета

Ваш код должен выглядеть примерно так:

  1. await getData ();
  2. обновить состояние
...