问题描述
在flutter应用程序中,当输入字段包含在Scrollable,Opacity,Stack中时,当出现键盘时,可滚动视图未正确放置.
In flutter app, when an input field is wrapped inside Scrollable, Opacity, Stack, when keyboard appear, the scrollable view is not correctly placed.
当键盘出现时如何正确显示可滚动视图?
How to make the scrollable view correctly when keyboard appear?
如果输入字段未包装在Scrollable内,则根本不会出现键盘.可以通过在以下代码中用Column更改 ListView
来进行测试.
If input field is not wrapped inside Scrollable, the keyboard is not appear at all. It can be test by changing ListView
with Column in the following code.
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class SecurePage extends StatelessWidget {
final int index;
SecurePage(this.index);
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Secure'),
),
body: new Column(
children: <Widget>[
new Text('No $index'),
new IconButton(
icon: new Icon(Icons.verified_user),
onPressed: () {
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context) {
return new VerifiedPage(index + 1);
},
),
);
},
),
],
),
);
}
}
class VerifiedPage extends StatelessWidget {
final int index;
VerifiedPage(this.index);
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Verity'),
),
body: new ListView(
children: <Widget>[
new Text('No $index'),
new Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: new TextField(
autofocus: index % 2 == 1,
decoration: const InputDecoration(
hintText: 'Search',
),
),
),
new IconButton(
icon: new Icon(Icons.security),
onPressed: () {
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context) {
return new SecurePage(index + 1);
},
),
);
},
),
],
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
int _page = 0;
List<Widget> initialWidgets = <Widget>[
new SecurePage(0),
new VerifiedPage(0),
];
Widget build(BuildContext context) {
return new Scaffold(
body: new Stack(
children: new List<Widget>.generate(initialWidgets.length, (int index) {
return new IgnorePointer(
ignoring: index != _page,
child: new Opacity(
opacity: _page == index ? 1.0 : 0.0,
child: new Navigator(
onGenerateRoute: (RouteSettings settings) {
return new MaterialPageRoute(
builder: (_) => initialWidgets[index],
);
},
),
),
);
}),
),
bottomNavigationBar: new BottomNavigationBar(
currentIndex: _page,
onTap: (int index) {
setState(() {
_page = index;
});
},
items: <BottomNavigationBarItem>[
new BottomNavigationBarItem(
icon: new Icon(Icons.security),
title: new Text('Secure'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.verified_user),
title: new Text('Verified'),
),
],
),
);
}
}
推荐答案
问题是您正在将 Scaffold
嵌套在 Scaffold
内,并且每个脚手架都试图为键盘添加填充.您一次只能使用一个 Scaffold
.可以考虑使用 Column
将 AppBar
放置在屏幕顶部,而不是使用内部的 Scaffold
.
The problem is that you're nesting a Scaffold
inside a Scaffold
and each scaffold is trying to add padding for the keyboard. You should only ever use one Scaffold
at a time. Instead of having an inner Scaffold
, consider using Column
to position your AppBar
at the top of the screen.
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
class SecurePage extends StatelessWidget {
final int index;
SecurePage(this.index);
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new AppBar(
title: new Text('Secure'),
),
new Text('No $index'),
new IconButton(
icon: new Icon(Icons.verified_user),
onPressed: () {
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context) {
return new VerifiedPage(index + 1);
},
),
);
},
),
],
);
}
}
class VerifiedPage extends StatelessWidget {
final int index;
VerifiedPage(this.index);
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new AppBar(
title: new Text('Verity'),
),
new Text('No $index'),
new Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: new TextField(
autofocus: index % 2 == 1,
decoration: const InputDecoration(
hintText: 'Search',
),
),
),
new IconButton(
icon: new Icon(Icons.security),
onPressed: () {
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context) {
return new SecurePage(index + 1);
},
),
);
},
),
],
);
}
}
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
int _page = 0;
List<Widget> initialWidgets = <Widget>[
new SecurePage(0),
new VerifiedPage(0),
];
Widget build(BuildContext context) {
return new Scaffold(
body: new Stack(
children: new List<Widget>.generate(initialWidgets.length, (int index) {
return new IgnorePointer(
ignoring: index != _page,
child: new Opacity(
opacity: _page == index ? 1.0 : 0.0,
child: new Navigator(
onGenerateRoute: (RouteSettings settings) {
return new MaterialPageRoute(
builder: (_) => initialWidgets[index],
);
},
),
),
);
}),
),
bottomNavigationBar: new BottomNavigationBar(
currentIndex: _page,
onTap: (int index) {
setState(() {
_page = index;
});
},
items: <BottomNavigationBarItem>[
new BottomNavigationBarItem(
icon: new Icon(Icons.security),
title: new Text('Secure'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.verified_user),
title: new Text('Verified'),
),
],
),
);
}
}
这篇关于在Stack>下换行时,键盘颤振问题不透明度>可卷动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!