Listview 颤振,如何让一个小部件';是否在SingleChildScrollView中匹配父对象的高度?

Listview 颤振,如何让一个小部件';是否在SingleChildScrollView中匹配父对象的高度?,listview,flutter,scrollview,Listview,Flutter,Scrollview,我想创建一个可以刷新列表项的自定义小部件。它如下所示: ... Widget build(BuildContext context){ return new RefreshIndicator( child:data.isEmpty? new SingleChildScrollView( child:new Center( child:new Text("this is a empty widget which needs to be center i

我想创建一个可以刷新列表项的自定义小部件。它如下所示:

...
Widget build(BuildContext context){
 return new RefreshIndicator(
   child:data.isEmpty?
     new SingleChildScrollView(
      child:new Center(
        child:new Text("this is a empty widget which needs to be center in parent!)
       ),
     )
     :
     new ListView.separated(...)
);
}
但当我触摸屏幕并移动时,它无法刷新,我想它太短了,不足以滚动?
我试图定义一个
容器
安装的
中心
作为相同的结果,但是如果我将
1000
定义为
容器的
高度
,它现在可以刷新了,我该怎么做呢?

您需要使用
AlwaysScrollableScrollPhysics()
确保滚动视图始终是可滚动的

您还需要创建一个大的可滚动区域。您可以使用
容器
并使用
MediaQuery
获取屏幕高度

child: RefreshIndicator(
  onRefresh: () async {
    print('onRefresh called');
  },
  child: SingleChildScrollView(
    physics: const AlwaysScrollableScrollPhysics(),
    child: Container(
      alignment: Alignment.topCenter,
      padding: EdgeInsets.only(top: 50),
      height: MediaQuery.of(context).size.height,
      child: Text('hello'),
    ),
  ),
),
这不是一个完美的解决方案。仅当用户拖动文本周围的空白时,刷新功能才起作用。如果用户拖动文本,则他们看不到刷新符号。它们还可以向上滚动一点

最好的解决方案是使用具有始终启用垂直滚动的页面视图和单个页面:

child: RefreshIndicator(
  onRefresh: () async {
    print('onRefresh called');
  },
  child: PageView(
    scrollDirection: Axis.vertical,
    physics: const AlwaysScrollableScrollPhysics(),
    children: <Widget>[
      Center(
        child: Text('hello'),
      )
    ],
  ),
),
子项:刷新指示器(
onRefresh:()异步{
打印('onRefresh called');
},
子:页面视图(
滚动方向:轴垂直,
物理:常量AlwaysScrollablePhysics(),
儿童:[
居中(
child:Text('hello'),
)
],
),
),

您可以使用具有
视口约束的
布局生成器
包装您的
刷新指示器
,也可以使用
约束框
(SingleChildScrollView
的子对象)包装
中心
小部件,并将
最小高度
设置为
视口约束.最大高度
SingleChildScrollView
还需要始终可滚动,以便刷新指示器工作,因此您需要将
physics
设置为
const AlwaysScrollableScrollPhysics()
。在您的情况下,它将类似于:

  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints viewportConstraints) {
        return RefreshIndicator(
          onRefresh: () async {},
          child: data.isEmpty
              ? SingleChildScrollView(
                  physics: const AlwaysScrollableScrollPhysics(),
                  child: ConstrainedBox(
                    constraints: BoxConstraints(
                      minHeight: viewportConstraints.maxHeight,
                    ),
                    child: Center(
                        child: Text(
                            "this is an empty widget which needs to be center in parent!")),
                  ),
                )
              : ListView.separated(...),
        );
      },
    );
  }

被接受的答案可能会引起一些问题。是我的优化版本。