【问题标题】:Does setState() trigger itself when variables and data change just like stream and streambuilder does?当变量和数据发生变化时,setState() 是否会像 stream 和 streambuilder 一样触发自身?
【发布时间】:2020-05-15 03:03:52
【问题描述】:
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);
});

}

嗨,我对 setState() 的作用感到困惑。如果温度或条件的值或 setState 内部的任何变化,setState() 会触发自身更新 UI 并使用更新的温度或条件构建 UI,还是我必须自己调用 updateUI 函数来调用 setState 并更新 UI?

【问题讨论】:

    标签: flutter dart setstate


    【解决方案1】:

    SetState 在调用时重建构建方法。

    SetState 永远不会调用它自己,你必须调用它。如果您更改了变量的值并且没有使用 SetState,那么它不会反映在 UI 中,为此您必须调用 SetState。

    当您将代码放入 SetState 中的 updateUI 时,它会在您调用该方法时更新 ui,如果您不在那里使用 SetState,那么它不会反映 UI 中的更改。

    【讨论】:

    • 那么 streamBuilder 会有帮助吗?因为现在如果我想通过改变温度和条件来反映 UI 的变化,我必须热重启。
    • 不,您可以在更改变量值时调用 SetState,就像在 updateUI 方法中所做的那样。
    【解决方案2】:

    文档指出setState(fn()),调用 setState 会通知框架此对象的内部状态已发生更改,可能会影响此子树中的用户界面,这会导致框架为此 State 对象安排构建。

    每当一个名为 ui 的 setState 将被安排用于基于新状态的构建。

    例如:

     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"))
        ]);
      }
    }
    

    注意:initState() 在 Stateful widget 的生命周期中会被调用一次。

    【讨论】:

      【解决方案3】:

      setState():

      通知框架这个对象的内部状态已经改变。

      每当您更改 State 对象的内部状态时,请在您传递给 setState 的函数中进行更改:

      setState(() { _myState = newValue; });
      

      调用 setState 会通知框架此对象的内部状态已发生更改,可能会影响此子树中的用户界面,这会导致框架为此 State 对象安排构建。

      【讨论】:

        【解决方案4】:

        不,您需要调用它才能“重新绘制”当前的有状态小部件。我相信改变的变量也不需要被包裹在 setState 中,只要它在 setState 之前被改变。

        【讨论】:

          猜你喜欢
          • 2014-12-20
          • 1970-01-01
          • 2019-05-23
          • 1970-01-01
          • 2011-09-28
          • 2021-10-25
          • 2017-05-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多