flutter: Sonsuz kaydırma için TabController'da NotificationListener
4 sekmem var ve bunlara tembel yükleme veya sonsuz kaydırma seçeneği eklemek istiyorum. Daha önce Scroll Controller ile denedim ama sonuna geldiğinde. Birden fazla kez tetiklenen olay. Dolayısıyla, API'ye yönelik birden fazla Gelecek http isteği vardır.
SO ile ilgili bazı soruları okudum ve NotificationListener'ı kullanmam gerekebileceğini fark ettim. Bir kez veya tüm sekmeler için tanımlamam gerektiğinden emin değilim. NotificationListener'ı nasıl kullanacağım hakkında hiçbir fikrim yok.
class _Searchstate extends State<Search> with SingleTickerProviderStateMixin{
ScrollController _scrollController = new ScrollController();
final _scaffoldKey = GlobalKey<ScaffoldState>();
TabController _controller;
TabBarView(
controller: _controller,
children: [
// Text("TAB ONE CONTENT"),
RefreshIndicator(
onRefresh: refreshData,
child:Container(
decoration: BoxDecoration(
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: (recommended) ? lists.length : searchlists.length,
itemBuilder: (BuildContext context, int index) {
return buildList1(context, index);
}),
),
),
//Text("TAB TWO CONTENT"),
RefreshIndicator(
onRefresh: refreshData1,
child:Container(
decoration: BoxDecoration(
color: Colors.black54,
),
padding: EdgeInsets.only(top: 10, bottom: 5),
height: MediaQuery.of(context).size.height,
width: double.infinity,
child: ListView.builder(
controller: _scrollcontroller,
itemCount: (nearme) ? lists1.length : searchlists1.length,
itemBuilder: (BuildContext context, int index) {
return buildList2(context, index);
}),
),
),
Veritabanından gelen verileri göstermek için Listview.Builder'ı kullandığım buildList aşağıdadır. ScrollController'ı bunda da aşağıdaki gibi kullanmaya çalıştım.
Widget buildList1(BuildContext context, int index) {
_scrollController.addListener((){
print(_scrollController.position.pixels);
print(_scrollController.position.maxScrollExtent);
if(_scrollController.position.pixels == _scrollController.position.maxScrollExtent){
print(recommended);
if(recommended){
//getData();
print('getData()1;');
}
// getData();
}
});
Tam kod çok uzun olduğu için sadece bu soruya bazı ilgili kodları ekledim. Daha fazla koda ihtiyacınız olursa bana bildirin.
Düzenle:
Notification listener'ı kullanmayı denedim ve eğer onu bir kez SCaffold çevresinde tanımladıysam o zaman çalışıyor en azından kaydırma olaylarını görebiliyorum ama 4 sekmem var ve bunu herkes için nasıl uygulayabileceğimi bilmiyorum. Çünkü tüm bu 4 sekme için koşul belirlemek oldukça zor olacaktır.
@override
Widget build(BuildContext context) {
return NotificationListener<ScrollNotification>(
child:Scaffold(
---- -- - - - - - More Codes -----
onNotification: (notificationInfo) {
if (notificationInfo is ScrollEndNotification) {
print("scroll");
print("detail:"+notificationInfo.dragDetails.toString());
/// your code
}
return true;
},
);
Sekmelerin içine koymaya çalıştığım kodun aynısı, ancak kaydırma olayını algılamıyor.
Yanıtlar
Onu çalıştırmayı başardım ama bunun etkili bir yol olup olmadığından emin değilim. Benzer bir sorunla karşılaşmış olabilecek başkaları olabilir.
Aşağıdaki kod, etkin sekmeyi tanımlamaya yardımcı olacaktır.
void initState(){
_controller = TabController(vsync: this, length: 4);
currentTab = (_controller.index);
_controller.addListener(() {
if(_controller.indexIsChanging) {
print("tab is animating. from active (getting the index) to inactive(getting the index) ");
}else {
//tab is finished animating you get the current index
print(_controller.index);
currentTab = (_controller.index);
_handleTabSelection();
}
});
ve aşağıdaki kodu NotificationListner'a ekledim.
onNotification: (notificationInfo) {
if (notificationInfo is ScrollEndNotification && notificationInfo.metrics.pixels == notificationInfo.metrics.maxScrollExtent) {
print("scroll");
if(currentTab == 0){
if(recommended == true && tab0 == 'Suggested' ){
// getData();
print('fire the 1 event');
}else{
print('Name()1;');
}
}
if(currentTab == 1){
if(nearme == true && tab1 == 'Near Me'){
//getData();
print('fire the 2nd event ');
}else{
}
}
if(currentTab == 2){
if(byRating == true && tab2 == 'By Rating'){
//getData();
print('fire the 3rd event');
}else{
}
}
if(currentTab == 3){
if(byprice == true && tab3 == 'Active'){
//getData();
print('fire the 4 event');
}else{
}
}
/// your code
}
return true;
},
);
Düzenleme : Birden fazla vuruşum olduğu için yukarıdaki kod sol ve sağ kaydırmada da çalışıyor. Bunu önlemek için kodu aşağıdaki gibi değiştirdim.
if (notificationInfo is ScrollEndNotification && notificationInfo.metrics.axisDirection == AxisDirection.down && notificationInfo.metrics.pixels == notificationInfo.metrics.maxScrollExtent) {