Flutter 在Flatter上键入TextField时滚动到顶部

Flutter 在Flatter上键入TextField时滚动到顶部,flutter,dart,flutter-sliver,Flutter,Dart,Flutter Sliver,我在SliverPersistentHeaderDelegate上添加了TextFormField。滚动到中间/底部,然后在文本字段中键入后,SliverList自动进入顶部。如何禁用此功能 完整代码 class MyWidget extends StatelessWidget { static const String route = '/myWidget'; @override Widget build(BuildContext context) { return Sc

我在
SliverPersistentHeaderDelegate
上添加了
TextFormField
。滚动到中间/底部,然后在文本字段中键入后,
SliverList
自动进入顶部。如何禁用此功能

完整代码

class MyWidget extends StatelessWidget {
  static const String route = '/myWidget';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
            child: CustomScrollView(
              slivers: <Widget>[
                SliverPersistentHeader(
                  pinned: true,
                  delegate: MyDynamicHeader(),
                ),
                SliverList(
                    delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
                      return Container(
                        height: 200,
                        color: Color(Random().nextInt(0xffffffff)),
                      );
                    },
                    )
                )
              ],
            )
        )
    );
  }
}

class MyDynamicHeader extends SliverPersistentHeaderDelegate {
  int index = 0;

  @override
  Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
    return LayoutBuilder(
        builder: (context, constraints) {
          final Color color = Colors.primaries[index];
          final double percentage = (constraints.maxHeight - minExtent)/(maxExtent - minExtent);

          if (++index > Colors.primaries.length-1)
            index = 0;

          return Container(
            decoration: BoxDecoration(
                boxShadow: [BoxShadow(blurRadius: 4.0, color: Colors.black45)],
                gradient: LinearGradient(
                    colors: [Colors.blue, color]
                )
            ),
            height: constraints.maxHeight,
            child: SafeArea(
                child: Center(
                  child: Row(
                    children: <Widget>[
                      CircularProgressIndicator(
                        value: percentage,
                        valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
                      ),
                      InkWell(
                        onTap: (){
                          print('is working');
                        },
                        child: Container(
                          height: 50,
                          width: 100,
                          color: Palette.orelPay,
                        ),
                      ),
                      Expanded(child: TextFormField(
                        //controller: searchController,
                        decoration: InputDecoration(
                            contentPadding:
                            EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
                            hintText: "Search on OrelBuy",
                            border: OutlineInputBorder(
                                borderSide:
                                BorderSide(color: Palette.background, width: 32.0),
                                borderRadius: BorderRadius.circular(50.0)),
                            fillColor: Palette.background,
                            filled: true,
                            enabledBorder: OutlineInputBorder(
                                borderSide:
                                BorderSide(color: Palette.background, width: 32.0),
                                borderRadius: BorderRadius.circular(50.0)),
                            focusedBorder: OutlineInputBorder(
                                borderSide:
                                BorderSide(color: Palette.background, width: 32.0),
                                borderRadius: BorderRadius.circular(50.0))),
                      ),)
                    ],
                  ),
                )
            ),
          );
        }
    );
  }

  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate old) => false;

  @override
  double get maxExtent => 250.0;

  @override
  double get minExtent => 80.0;
}
类MyWidget扩展了无状态Widget{
静态常量字符串route='/myWidget';
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
子:自定义滚动视图(
条子:[
滑冰机(
对,,
委托:MyDynamicHeader(),
),
银表(
委托:SliverChildBuilderDelegate((BuildContext上下文,int索引){
返回容器(
身高:200,
颜色:颜色(Random().nextInt(0xffffffff)),
);
},
)
)
],
)
)
);
}
}
类MyDynamicHeader扩展SliverPersistentHeaderDelegate{
int指数=0;
@凌驾
小部件构建(BuildContext上下文、双收缩偏移、布尔重叠内容){
返回布局生成器(
生成器:(上下文、约束){
最终颜色=颜色。原色[索引];
最终双百分比=(constraints.maxHeight-minExtent)/(maxExtent-minExtent);
if(++index>Colors.primaries.length-1)
指数=0;
返回容器(
装饰:盒子装饰(
boxShadow:[boxShadow(模糊半径:4.0,颜色:Colors.black45)],
梯度:线性梯度(
颜色:[颜色。蓝色,颜色]
)
),
高度:constraints.maxHeight,
儿童:安全区(
儿童:中心(
孩子:排(
儿童:[
循环压缩机指示器(
值:百分比,
valueColor:AlwaysStoppedAnimation(颜色.白色),
),
墨水池(
onTap:(){
打印(“正在工作”);
},
子:容器(
身高:50,
宽度:100,
颜色:Palette.orelPay,
),
),
已展开(子项:TextFormField)(
//控制器:搜索控制器,
装饰:输入装饰(
内容填充:
来自LTRB(20.0,15.0,20.0,15.0)的边缘集,
hintText:“在OrelBuy上搜索”,
边框:大纲输入边框(
边界:
边框(颜色:调色板.背景,宽度:32.0),
边界半径:边界半径。圆形(50.0)),
fillColor:Palette.background,
是的,
enabledBorder:OutlineInputBorder(
边界:
边框(颜色:调色板.背景,宽度:32.0),
边界半径:边界半径。圆形(50.0)),
聚焦顺序:大纲输入边框(
边界:
边框(颜色:调色板.背景,宽度:32.0),
边界半径:边界半径。圆形(50.0)),
),)
],
),
)
),
);
}
);
}
@凌驾
布尔应该重建(SliverPersistentHeaderDelegate old)=>false;
@凌驾
double get maxExtent=>250.0;
@凌驾
double-get-minExtent=>80.0;
}

您可以使用CustomScrollView小部件的物理特性来控制滚动

CustomScrollView(
      physics: PageScrollPhysics(), // added
      slivers: <Widget>[
CustomScrollView(
物理:PageScrollPhysics(),//已添加
条子:[

Viren谢谢。你能检查一下这个问题吗?