class _LocationScreenState extends State<LocationScreen> { WeatherModel weather = WeatherModel(); String weatherMessage; String weatherIcon; String cityName; int temperature; @override void initState() { super.initState(); updateUI(widget.locationWeather); } void updateUI(dynamic weatherData) { setState(() { temperature=weatherData['main']['temp'].toInt(); var condition = weatherData['weather'][0]['id']; cityName=weatherData['name']; weatherIcon=weather.getWeatherIcon(condition); weatherMessage=weather.getMessage(temperature); }); } Hi I am getting confused with what setState() does. If the value of temperature or condition or anything changes inside that of setState does setState() trigger itself to update the UI and build UI with updated temp or condition or do I have to invoke updateUI function myself to invoke setState and update the UI?
4 Réponses :
SetState reconstruit la méthode de construction chaque fois que cela appelle. P>
SetState Ne jamais l'appeler, vous devez l'appeler. Si vous changez de valeur de votre variable et que vous n'avez pas utilisé SSTATE, il ne se réfléchira pas à l'interface utilisateur, de le faire, vous devez appeler SSTATE. P>
Lorsque vous vous mettez votre code dans UPTATEUI dans SETState, il mettra donc à jour l'interface utilisateur chaque fois que vous appelez cette méthode, où, comme si vous n'utilisez pas SSTATE, il ne reflétera pas les modifications de l'interface utilisateur. P>
Alors Streambuilder aidera? Parce que pour le moment si je veux refléter des changements d'interface utilisateur avec modification de la température et de la condition, je dois redémarrer à chaud.
Non, vous pouvez appeler SSTATE chaque fois que vous modifiez la valeur de la variable que vous effectuez dans la méthode UpdateUI.
Documentation stipule que Chaque fois qu'un ensemble d'instate appelé l'interface utilisateur sera programmé pour une construction basée sur le nouvel état. p> STSTATATE (FN ()) CODE>, appelant SSTATE notifie le cadre que l'état interne de cet objet a changé d'une manière pouvant avoir une incidence sur l'interface utilisateur dans ce sous-arbre, ce qui provoque la Cadre pour planifier une version pour cet objet d'état.
class _MyWidgetState extends State<MyWidget> {
String text;
@override
void initState() {
super.initState();
text = "Hello";
}
void updateUI(String action) {
setState(() {
text = action;
});
}
@override
Widget build(BuildContext context) {
return Column(children: [
Text(text, style: Theme.of(context).textTheme.headline4),
MaterialButton(
onPressed: () {
updateUI("Pressed");
},
child: Text("Change state"))
]);
}
}
SetState (): strud> notifier le cadre que l'état interne de cet objet a changé. P> Chaque fois que vous modifiez l'état interne d'un objet d'état, faites le Changement d'une fonction que vous passez à SetState: P> setState(() { _myState = newValue; });
Nope, vous devez l'appeler afin de "re-dessiner" le widget d'état actuel. Je crois que la variable qui a changé n'a pas besoin d'être enveloppée à l'intérieur de l'ensemble de l'ensemble, tant que cela est changé avant la création de l'ensemble. P>