Abi*_*san 2 setstate dart flutter
我用于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'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
这里的_appLink价值是www.facebook.com
的目的setState是告诉框架状态中的变量已更改,并且需要重新构建小部件以反映该更改。因此,调用再次setState调用该build函数,在您的情况下Future,它会调用您的,setState再次调用,触发build等等。
要解决此问题,您应该调用Futurein initState,并FutureBuilder在数据准备好时使用 a来显示数据。
例子:
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');
}
),
}
}
Run Code Online (Sandbox Code Playgroud)