Flutter : ListView : Scroll parent ListView when child ListView reach bottom - ClampingScrollPhysics not working in sized container

后端 未结 3 1684
醉酒成梦
醉酒成梦 2021-01-03 11:54

I\'m using Flutter version 1.12.13+hotfix.

I\'m looking for a solution to be able to scroll inside a ListView and when reached the bottom, automatically give scroll

3条回答
  •  庸人自扰
    2021-01-03 12:25

    Thanks for Hamed Hamedi solution :) ! I made a better solution, I think, based on NotificationListener ! (I discovered this functionnality thanks to him).

    @override
      Widget build(BuildContext context) {
        return Container(
          padding: EdgeInsets.all(8),
          color: Colors.yellow,
          child: ListView.builder(
            controller: controller,
            itemBuilder: (c, i) =>
            i == 10
              ? Container(
              height: 150,
              color: Colors.red,
              child: NotificationListener(
                onNotification: (OverscrollNotification value) {
                  if (value.overscroll < 0 && controller.offset + value.overscroll <= 0) {
                    if (controller.offset != 0) controller.jumpTo(0);
                    return true;
                  }
                  if (controller.offset + value.overscroll >= controller.position.maxScrollExtent) {
                    if (controller.offset != controller.position.maxScrollExtent) controller.jumpTo(controller.position.maxScrollExtent);
                    return true;
                  }
                  controller.jumpTo(controller.offset + value.overscroll);
                  return true;
                },
                child: ListView.builder(
                  itemBuilder: (c, ii) => Text('-->' + ii.toString()),
                  itemCount: 20,
                ),
              ),
            )
              : Text(i.toString()),
            itemCount: 45,
          ),
        );
      }
    

    The solution wrapped into StatelessWidget :

    import 'package:flutter/material.dart';
    
    class ScrollParent extends StatelessWidget {
      final ScrollController controller;
      final Widget child;
    
      ScrollParent({this.controller, this.child});
    
      @override
      Widget build(BuildContext context) {
        return NotificationListener(
          onNotification: (OverscrollNotification value) {
            if (value.overscroll < 0 && controller.offset + value.overscroll <= 0) {
              if (controller.offset != 0) controller.jumpTo(0);
              return true;
            }
            if (controller.offset + value.overscroll >= controller.position.maxScrollExtent) {
              if (controller.offset != controller.position.maxScrollExtent) controller.jumpTo(controller.position.maxScrollExtent);
              return true;
            }
            controller.jumpTo(controller.offset + value.overscroll);
            return true;
          },
          child: child,
        );
      }
    }
    

提交回复
热议问题