如何使我的表单在键盘输入时可滚动
How to make my Form scrollable on keyboard input
我在Flutter中设计了一个表单。我想让它 scrollable 每当键盘打开时,这样用户就可以填写隐藏在键盘下方的字段。这是相同的屏幕截图:
我已经尝试使用 SingleChildScrollView()
,但是,它不起作用。我尝试将各种小部件包装在 SingleChildScrollView()
中,但它不起作用。我也尝试将其包装在 Expanded()
小部件中,但仍然无法实现我的目标。
这是我的代码:
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(10),
child: Column(children: <Widget>[
Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ListTile(
title: const Text("Name"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ElevatedButton(
style: style,
child: Container(
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: const Text(
'Update',
style: TextStyle(
fontSize: 24, color: Colors.white, fontFamily: 'Nunito'),
),
),
onPressed: () {
}
},
),
]),
);
尝试用填充包裹它
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
SingleChildScrollView 小部件应该可以解决您的问题。它可能是你放置它的地方。它需要包装整个表单,而不仅仅是一个单独的列表块。以下是使用您的示例作为基础的示例。
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Container(
margin: const EdgeInsets.all(10),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
ListTile(
title: const Text("1"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("2"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("3"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("4"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("5"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
]),
),
),
);
}
我以前遇到过这个问题,我设法通过用 SingleChildScrollView
包装包含小部件的列并给它 Axis.vertical
来缓解它。然后到parent scaffold中设置resizeToAvoidBottomInset
为true
.
Depends on how your widget tree looks
Scaffold(
resizeToAvoidBottomInset: true,
///
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column( /// Your widget
children: []
),
),
);
我在Flutter中设计了一个表单。我想让它 scrollable 每当键盘打开时,这样用户就可以填写隐藏在键盘下方的字段。这是相同的屏幕截图:
我已经尝试使用 SingleChildScrollView()
,但是,它不起作用。我尝试将各种小部件包装在 SingleChildScrollView()
中,但它不起作用。我也尝试将其包装在 Expanded()
小部件中,但仍然无法实现我的目标。
这是我的代码:
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(10),
child: Column(children: <Widget>[
Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ListTile(
title: const Text("Name"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ElevatedButton(
style: style,
child: Container(
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: const Text(
'Update',
style: TextStyle(
fontSize: 24, color: Colors.white, fontFamily: 'Nunito'),
),
),
onPressed: () {
}
},
),
]),
);
尝试用填充包裹它
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
SingleChildScrollView 小部件应该可以解决您的问题。它可能是你放置它的地方。它需要包装整个表单,而不仅仅是一个单独的列表块。以下是使用您的示例作为基础的示例。
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Container(
margin: const EdgeInsets.all(10),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
ListTile(
title: const Text("1"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("2"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("3"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("4"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
ListTile(
title: const Text("5"),
subtitle: TextFormField(
decoration: const InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(8))),
contentPadding: EdgeInsets.symmetric(horizontal: 10),
hintText: 'Type your name here',
),
),
),
]),
),
),
);
}
我以前遇到过这个问题,我设法通过用 SingleChildScrollView
包装包含小部件的列并给它 Axis.vertical
来缓解它。然后到parent scaffold中设置resizeToAvoidBottomInset
为true
.
Depends on how your widget tree looks
Scaffold(
resizeToAvoidBottomInset: true,
///
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column( /// Your widget
children: []
),
),
);