如何解决FutureBuilder 显示 AlertDialog - 将焦点放在 TextField 时重建所有者小部件
我对 Flutter 有一个非常奇怪的行为,我不明白。
该应用有一个 TextField 小部件和一个 StatefulWidget。在这个有状态的小部件中,我有一个 FutureBuilder 做一些工作,在这项工作中,它显示了一个 AlertDialog 有 2 个按钮调用每个 Navigator.of(context).pop() 结果与否。 第一部分运行良好,但是一旦 FutureBuilder 完成,当我将焦点放在 TextField 上然后将其删除时,Stateful 小部件将再次重建(并在未来再次触发)。
它与 AlertDialog 和对 Navigator.of(context).pop() 的调用有关,但我不明白为什么在这种特殊情况下有状态小部件会重建以及如何解决这个问题。
有什么想法吗?
要重现的代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) currentFocus.focusedChild.unfocus();
},child: MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,),home: Scaffold(
body: Center(
child: Column(
children: [
TextField(autofocus: false),MyHomePage(),],);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Future<String> futureCall() async {
await Future.delayed(Duration(seconds: 2));
return await showCupertinoDialog(
context: context,builder: (BuildContext context) => CupertinoAlertDialog(
title: Text('Employee Data'),content: Text('Do you want to show data?'),actions: <Widget>[
CupertinoDialogAction(
onPressed: () => Navigator.of(context).pop(),child: Text('NO'),CupertinoDialogAction(
onPressed: () => Navigator.of(context).pop('Yes'),isDefaultAction: true,child: Text('YES'),)
],);
}
@override
Widget build(BuildContext context) {
print("BUILD");
return FutureBuilder(
future: futureCall(),builder: (context,dataSnapshot) {
if (dataSnapshot.connectionState != ConnectionState.done) {
return Center(child: CircularProgressIndicator());
} else {
return Text(dataSnapshot.data ?? "NULL");
}
},);
}
}```
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。