Flutter:覆盖层中的文本输入框会触发重建

3
我似乎无法弄清楚为什么在点击按钮显示Overlay并将焦点放在Textfield后,下面的代码会调用State.build三次(调用State.build)。
现在,我知道一个MaterialApp在另一个MaterialApp中不是一个好主意,这是问题的第二部分:当我删除包装Scaffold周围的MaterialApp并尝试聚焦Textfield时,为什么键盘(在使用Android 8.1.0的物理设备上进行测试)不会出现?根据应该找到Overlay.of(context)的根处有一个MaterialApp。
import "package:flutter/material.dart";
import "package:flutter/services.dart";

void main() {
  SystemChrome.setEnabledSystemUIOverlays([]);
  runApp(
    MaterialApp(
      home: Scaffold(
        body: MyOtherApp()
      )
    )
  );
}

class MyAppState extends State<MyApp> {
  TextEditingController controller = TextEditingController();

  @override
    Widget build(BuildContext context) {
      controller.text = "placeholder";

      return MaterialApp(
        home: Scaffold(
          body: (){
            print("built");
            return TextField(
              controller: controller,
            );
          }()
        )
      );
    }
}

class MyApp extends StatefulWidget {
  @override
    State<StatefulWidget> createState() {
      return MyAppState();
    }
}

class MyOtherApp extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Center(
        child: FlatButton(
          child: Text(
            "show overlay",
          ),
          onPressed: () {
            Overlay.of(context).insert(
              OverlayEntry(
                builder: (context) {
                  return MyApp();
                }
              )
            );
          }
        )
      );
    }
}
1个回答

0
在我的情况下,我将SystemChrome.setEnabledSystemUIOverlays([]);放在build下而不是主要部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接