我使用setState(() {})
为变量分配值。但是它一次又一次地打印。为什么会这样反应?我该如何解决?
这是我的代码:
class Sample extends StatefulWidget {
@override
_SampleState createState() => _SampleState();
}
class _SampleState extends State<Sample> {
String _message;
String _appLink;
Firestore db = Firestore.instance;
@override
Widget build(BuildContext context) {
db.collection('share').document('0').get().then((value) {
var message = value.data['message'];
print(message);
var appLink = value.data['appLink'];
setState(() {
_message = message;
_appLink = appLink;
});
});
return Container(
child: Text('$_message $_appLink'),
);
}
}
这是我的输出:
此处_appLink
的值为www.facebook.com
答案 0 :(得分:5)
setState
的目的是告诉框架状态中的变量已更改,需要重新构建窗口小部件以反映该更改。因此,调用setState
会再次调用build
函数,在您的情况下,它会调用您的Future
,后者会再次调用setState
,并触发build
,依此类推。 / p>
要解决此问题,您应该在Future
中调用initState
,并在准备好数据后使用FutureBuilder
来显示数据。
示例:
class _SampleState extends State<Sample> {
Firestore db = Firestore.instance;
Future databaseFuture;
@override
void initState() {
databaseFuture = db.collection('share').document('0').get()
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: databaseFuture,
builder: (context, snapshot) {
if(!snapshot.hasData) {
return CircularProgressIndicator();
}
var message = snapshot.data.data['message'];
print(message);
var appLink = snapshot.data.data['appLink'];
return Text('$message $appLink');
}
),
}
}