Когда мы это делаем:
def foo(a=[]):
...
... мы присваиваем аргумент a
списку unnamed , если вызывающий объект не передает значение a .
Чтобы упростить эту дискуссию, давайте временно присвоим неназванному списку имя. Как насчет pavlo
?
def foo(a=pavlo):
...
В любое время, если вызывающий абонент не сообщает нам, что a
, мы повторно используем pavlo
.
Если pavlo
изменен (модифицируется), а foo
заканчивает его модификацию, эффект, который мы замечаем в следующий раз, foo
вызывается без указания a
.
Итак, это то, что вы видите (помните, pavlo
инициализируется в []):
>>> foo()
[5]
Теперь pavlo
- [5].
Вызов foo()
снова снова изменяет pavlo
:
>>> foo()
[5, 5]
Задание a
при вызове foo()
гарантирует, что pavlo
не коснулся.
>>> ivan = [1, 2, 3, 4]
>>> foo(a=ivan)
[1, 2, 3, 4, 5]
>>> ivan
[1, 2, 3, 4, 5]
Итак, pavlo
все еще [5, 5]
.
>>> foo()
[5, 5, 5]
У меня не было много информации о вашем коде, поэтому я решил это. Впечатление засчитывается только тогда, когда изображение полностью видно на экране, вы можете изменить это, используя выражение _count =
. И я использовал простой Container
для Image
.
Сначала посмотрите на этот скриншот.
<час>Код
void main() => runApp(MaterialApp(home: HomePage()),);
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
ScrollController _scrollController;
double _heightListTile = 56, _heightContainer = 200, _oldOffset = 0, _heightBox, _initialAdd;
int _initialCount, _count, _previousCount = 0, _itemsInList = 4;
@override
void initState() {
super.initState();
_heightBox = ((_itemsInList) * _heightListTile) + _heightContainer;
_scrollController = ScrollController();
_scrollController.addListener(() {
double offset = _scrollController.offset;
if (offset >= _oldOffset) {
_oldOffset = offset;
_count = _initialCount + (offset + _initialAdd) ~/ _heightBox;
if (_count != _previousCount) setState(() {});
_previousCount = _count;
}
});
Timer.run(() {
bool isIos = Theme.of(context).platform == TargetPlatform.iOS;
var screenHeight = MediaQuery.of(context).size.height - (isIos ? 100 : 80); // for non notches phone use 76 instead of 100 (it's the height of status and navigation bar)
_initialCount = screenHeight ~/ _heightBox;
_initialAdd = screenHeight % _heightBox;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(_count == null ? "Let's count" : "Images shown = ${_count}")),
body: ListView.builder(
itemCount: 100,
controller: _scrollController,
itemBuilder: (context, index) {
if (index == 0) return Container();
if (index != 0 && index % (_itemsInList + 1) == 0) {
return Container(
height: _heightContainer,
alignment: Alignment.center,
color: Colors.blue[(index * 20) % 1000],
child: Text("Image #${(index + 1) ~/ 5}"),
);
}
return SizedBox(height: _heightListTile, child: ListTile(title: Text("Item ${index}")));
},
),
);
}
}