路由后,TextField单击重建/重新加载小部件

时间:2018-11-22 08:27:32

标签: 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');
}

此处应用程序已加载了屏幕1,然后单击“转到屏幕2”按钮将在屏幕2上加载文本字段。单击此字段将带动键盘,然后单击键盘上的“完成”,然后再次聚焦于文本字段将重建屏幕。当键盘出现或消失时,这种情况一直发生。

但是,如果将Screen2设置为登录页面,则单击文本字段并执行上述相同过程将不会重新加载小部件。小部件构建仅发生一次。似乎问题是从Screen 1导航Screen2时

 runApp(new MaterialApp(
    home: new Screen2(),
    routes: <String, WidgetBuilder>{
      '/screen2': (BuildContext context) => new Screen2()
    },
  ));

1 个答案:

答案 0 :(得分:3)

这是正常行为,没有问题。实际上,它在build方法的规范之内: 可以将其称为任意次数,您应该期望如此。

如果这样做会导致问题,则您的build函数很可能不是不纯。这意味着它包含诸如http调用之类的副作用。

这些不应在build方法中完成。此处有更多详细信息:How to deal with unwanted widget build?


关于“什么触发构建”,有一些常见情况:

  • 路由弹出/推送,用于输入/输出动画
  • 调整屏幕大小,通常是由于键盘的外观或方向改变
  • 父级小部件重新创建了它的子级
  • 窗口小部件所依赖的InheritedWidget(Class.of(context)模式)更改