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