gpt4 book ai didi

flutter - NestedScrollView 中的 CupertinoSliverRefreshControl

转载 作者:行者123 更新时间:2023-12-05 04:38:16 26 4
gpt4 key购买 nike

在我的应用程序中,我需要复杂的 ScrollView 。作为垂直列表和动画标题中的水平列表。下面的代码是一个极简示例,可以使我的问题在 iOS 设备上重现。

我在 flutter 中遇到嵌套 ScrollView 的问题。如果我使用 SliverOverlapAbsorberSliverOverlapInjector 使用的 CupertinoSliverRefreshControl(进度指示器)不会在下拉时显示。

所以我用一个红色的 Container 代替了它。它接缝就像它被转移到顶部所以它在应用程序栏下方。当我在 SliverAppBar 中将 pinned 设置为 false 时,它​​显示正确,但我需要保留 appbar。我不明白固定参数与此有什么关系。

另外,如果我在我的 SliverFixedExtentList 中放置较少的项目(假设是 5 个而不是 50 个),CupertinoSliverRefreshControl 根本不可能下拉(没有滚动,也只是不使用重叠观察器/注入(inject)器)。

谁能帮我,为什么会这样,或者有重叠观察器/注入(inject)器的替代方案吗?

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class TestScrollRefresh extends StatefulWidget {
const TestScrollRefresh({Key? key}) : super(key: key);

@override
State<TestScrollRefresh> createState() => _TestScrollRefreshState();
}

class _TestScrollRefreshState extends State<TestScrollRefresh> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool isBoxScrolled) {
return [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(
title: Text("Title"),
forceElevated: isBoxScrolled,
pinned: true,
),
),
];
},
body: Builder(
builder: (BuildContext context) {
final innerScrollController = PrimaryScrollController.of(context);

return CustomScrollView(
controller: innerScrollController,
slivers: <Widget>[
_refreshIndicator(),
SliverOverlapInjector(
handle:
NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverFixedExtentList(
itemExtent: 48.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(title: Text('Item $index'));
},
childCount: 50,
),
),
],
);
},
),
),
);
}

Future<bool> refresh() async {
print('wait for service to refresh dummy');
await Future<void>.delayed(const Duration(milliseconds: 5000));
return false;
}

_refreshIndicator() {
return CupertinoSliverRefreshControl(
onRefresh: () => refresh(),
builder: (BuildContext context, RefreshIndicatorMode refreshState, double pulledExtent, double refreshTriggerPullDistance, double refreshIndicatorExtent,){
return Container(color: Colors.red,);
},
);
}
}

最佳答案

我能够通过使用 CupertinoSliverRefreshControl 的构建器属性来解决这个问题:

        CupertinoSliverRefreshControl(
onRefresh: onRefresh,
builder: (context, refreshState, pulledExtent, refreshTriggerPullDistance, refreshIndicatorExtent) {
return Padding(
padding: const EdgeInsets.only(top: 100),
child: CupertinoSliverRefreshControl.buildRefreshIndicator(
context,
refreshState,
pulledExtent,
refreshTriggerPullDistance,
refreshIndicatorExtent,
),
);
},
),

GitHub comment也帮助我更好的理解了NestedScrollView的用法。

关于flutter - NestedScrollView 中的 CupertinoSliverRefreshControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70632833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com