【问题标题】:How to detect the position of a ListView Item?如何检测 ListView 项的位置?
【发布时间】:2019-08-16 23:02:17
【问题描述】:

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

【问题讨论】:

  • 您可以使用ScrollControlleritemExtent 来检测滚动位置和项目位置。

标签: listview dart flutter


【解决方案1】:

您可以通过将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)),
               ]
             ),
           ),
         ),
       );
       }),
     );
   }
 }

【讨论】:

  • 非常感谢,你拯救了我的夜晚。
猜你喜欢
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多