rah*_*lmr 7 android dart flutter flutter-layout
我遇到一个问题,当使用文本字段时,整个屏幕小部件都会重新加载。当应用程序将此屏幕加载为登录页面时,不会发生这种情况。
但是,当从另一个页面到该页面的路由发生并且单击文本字段时,就会发生重建。
我什至尝试了一个简单的应用程序,并且这个程序正在被复制。尝试了许多方法,但无法解决。
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');
}
Run Code Online (Sandbox Code Playgroud)
在这里,该应用加载了屏幕1,然后单击“转到屏幕2”按钮将在屏幕2中加载文本字段。单击此字段将带动键盘,然后单击键盘上的“完成”,然后再次聚焦于文本字段将重建屏幕。当键盘出现或消失时,这种情况一直发生。
但是,如果将Screen2设置为登录页面,则单击文本字段并执行上述相同过程将不会重新加载窗口小部件。小部件构建仅发生一次。似乎问题是从Screen 1导航Screen2时
runApp(new MaterialApp(
home: new Screen2(),
routes: <String, WidgetBuilder>{
'/screen2': (BuildContext context) => new Screen2()
},
));
Run Code Online (Sandbox Code Playgroud)
这是正常行为,没有问题。事实上,它符合build方法的规范:它可以被调用任意次数,并且您应该期望它如此。
如果这导致出现问题,那么您的build函数很可能不是 pure。这意味着它包含 http 调用或类似的副作用。
这些不应该在方法内完成build。更多详细信息请参见:如何处理不需要的小部件构建?
关于“什么触发构建”,有以下几种常见情况:
Class.of(context)模式)的改变| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |