我遇到了一个问题,当使用文本字段时,整个屏幕小部件会重新加载。
如果将此屏幕作为着陆页面加载应用程序,则不会发生此情况。
但是,当从另一页进行路由并单击文本字段时,就会发生重建。
我甚至尝试了一个简单的应用程序,也出现了这个问题。尝试了很多方法,但无法找到解决方案。
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
class Screen1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Screen 1"), // screen title
),
body: new Center(
child: new Column(
children: <Widget>[
new RaisedButton(
onPressed: () {
button1(context);
},
child: new Text("Go to Screen 2"),
)
],
),
),
);
}
}
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
print("Widget rebuilds");
return new Scaffold(
appBar: new AppBar(
title: new Text("Screen 2"),
),
body: new Center(
child: new Column(
children: <Widget>[
new Container(
height: 350.0,
child: TextFormField(
keyboardType: TextInputType.text,
style: TextStyle(fontSize: 16.0, color: Colors.black),
)),
],
),
),
);
}
}
void main() {
runApp(new MaterialApp(
home: new Screen1(),
routes: <String, WidgetBuilder>{
'/screen2': (BuildContext context) => new Screen2()
},
));
}
void button1(BuildContext context) {
print("Button 1");
Navigator.of(context).pushNamed('/screen2');
}
这里的应用程序加载了屏幕1,点击“转到屏幕2”按钮将加载屏幕2和文本字段。点击此字段会弹出键盘,点击键盘上的“完成”按钮并再次聚焦于文本字段将重新构建屏幕。当键盘出现和消失时,这种情况会一直发生。
但是如果将Screen2设置为登陆页面,那么点击文本字段并执行上述相同的过程将不会重新加载小部件。小部件只会构建一次。似乎问题出在从Screen1导航到Screen2时。
runApp(new MaterialApp(
home: new Screen2(),
routes: <String, WidgetBuilder>{
'/screen2': (BuildContext context) => new Screen2()
},
));