如何检测ListView Item的位置?

Jos*_*dez 3 listview dart flutter

如何根据列表视图项目在屏幕上的位置向其添加填充。例如,如果 listView 项位于屏幕中间,我希望将其内边距增加 10 点,如果 listView 项位于屏幕顶部附近,我希望将其内边距增加 15 点。

Maz*_*him 5

您可以通过将 a 附加ScrollController到您的ListView并创造性地使用它来实现这一点:

在此输入图像描述

首先,您需要定义一个ScrollController用于确定ScrollController.offset列表当前位置的变量。然后我添加了一堆变量来调整这个动态列表,同时保持其预期功能:

  class DynamicPadding extends StatefulWidget {
    DynamicPadding({Key key,}) : super(key: key);

    @override
    _DynamicPaddingState createState() => _DynamicPaddingState();
  }


  class  _DynamicPaddingState extends State<DynamicPadding> {

   ScrollController _controller;

   var _middlePadding = 10.0 ; // padding of centered items

   var _edgesPadding = 15.0 ; // padding of non-centered items

   var _itemSize = 100.0 ; 

   int _centeredItems = 3 ;

   int _numberOfEdgesItems ; // number of items which aren't centered at any moment

   int _aboveItems ; // number of items above the centered ones

   int _belowItems ; // number of items below the centered ones


   @override
   void initState() {
     _controller = ScrollController(); // Initializing ScrollController
     _controller.addListener(_scrollListener); add a listener to ScrollController to update padding
     super.initState();
   }

   _scrollListener() {
     setState(() {});
   }

   @override
   Widget build(BuildContext context) {
     return new Scaffold(
         backgroundColor: Colors.grey.shade200,
         appBar: new AppBar(title: new Text('Dynamic Padding Example'),),
     body: ListView.builder(
     controller: _controller ,
     itemCount: 20,
     itemBuilder: (context, index) {

       // This is how to calculate number of non-centered Items
       _numberOfEdgesItems = ( (MediaQuery.of(context).size.height - _centeredItems*(_itemSize + 2*(_middlePadding))) ~/ (_itemSize + 2*(_edgesPadding)) ) ; 

       _aboveItems = ( ( (_controller.offset) / (_itemSize + 2*(_edgesPadding)) ) + _numberOfEdgesItems/2 ).toInt() ;

       _belowItems = _aboveItems + _centeredItems ;

     return Container(
     padding:  index >= _aboveItems && index < _belowItems ? EdgeInsets.all(_middlePadding) : EdgeInsets.all(_edgesPadding) ,
     child: Card(
     child: Container(
       height: _itemSize,
         child: new Row(
             mainAxisAlignment: MainAxisAlignment.center,
             children: <Widget>[
               Text(index.toString(), style: TextStyle(fontSize: 36.0, fontWeight: FontWeight.bold)),
               ]
             ),
           ),
         ),
       );
       }),
     );
   }
 }
Run Code Online (Sandbox Code Playgroud)