一尘不染

在Flutter中结合SingleChildScrollView和PageView

flutter

我创建了两个表单,并将它们添加到PageView中。每个表单都有6个TextFormField。当我点击最后2个TextFormField时,键盘将显示在这些字段上方并隐藏它们。我需要的是向上滚动表格以显示这些字段,当我点击每个字段并且键盘可见时。对于这种方法,我尝试像示例中一样在PageView下使用SingleChildScrollView,但是它不能满足我的需要。我怎样才能解决这个问题?

Widget build(BuildContext context) {
    return Scaffold(
        resizeToAvoidBottomPadding: false,
        body: PageView(
            children: <Widget>[
            _sampleForm(),
            _sampleForm(),  
            ],
        ),
    )
}

_sampleForm(){
    return Container(
        margin: const EdgeInsets.fromLTRB(0, 0, 0, 10),
        width: MediaQuery.of(context).size.width,
        child: SingleChildScrollView(
            child: Column(
                children: <Widget>[
                    Form(
                        child: Column(
                            children: <Widget>[
                                TextFormField(...),
                                TextFormField(...),
                                TextFormField(...),
                                TextFormField(...),
                                TextFormField(...),
                                TextFormField(...),
                            ],
                        ),
                    ),
                ],
            ),  
        ),
    );
}

阅读 933

收藏
2020-08-13

共1个答案

一尘不染

我已经对此进行了测试。

class SO extends StatefulWidget {
  @override
  _SOState createState() => _SOState();
}

class _SOState extends State<SO> {
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(""),
      ),
      body: PageView(
        children: <Widget>[
          _sampleForm("Page 1"),
          _sampleForm("Page 2"),
        ],
      ),
    );
  }

  _sampleForm(String title) {
    return SingleChildScrollView(
      child: Padding(
        padding: const EdgeInsets.all(32.0),
        child: Column(
          children: <Widget>[
            Form(
              child: Column(
                children: <Widget>[
                  ListTile(title: Text(title, textAlign: TextAlign.center)),
                  for (int i = 0; i < 10; i++) TextFormField(decoration: InputDecoration(hintText: "field ${i+1}"),),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

您只需要一些额外的填充来显示内容即可。

2020-08-13