首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetState没有做好它的工作--颤栗

SetState没有做好它的工作--颤栗
EN

Stack Overflow用户
提问于 2022-08-15 15:15:56
回答 2查看 68关注 0票数 0

当我的DropdownButton更新它包含的值时,它会这样做,setState会更新我按钮的突出显示文本。但是,在按钮中更新的相同变量" ms“没有正确地发送到"EventiWidget","ms”的第一个值总是被发送,即使在按钮ms中,它也会更改"EventiWidget“中的值。

代码语言:javascript
复制
String? ms;

class Eventi2 extends State<Eventi> {
  @override
  void initState() {
    super.initState();
    setState(() {});
    ms = meseAnnoAttuale;
    traduciMese();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        DropdownButton<String>(
          value: ms!,
          icon: const Icon(Icons.date_range),
          elevation: 16,
          style: TextStyle(color: Colors.blue[900], fontSize: 16),
          underline: Container(
            height: 2,
            color: Colors.blue[900],
          ),
          onChanged: (String? newValue) {
            ms = newValue;
            setState(() {});
          },
          items: <String>[
            'Agosto 2022',
            'Settembre 2022',
            'Ottobre 2022',
            'Novembre 2022',
            'Dicembre 2022',
            'Gennaio 2023',
            'Febbraio 2023',
            'Marzo 2023',
            'Aprile 2023',
            'Maggio 2023',
            'Giugno 2023',
            'Luglio 2023',
            'Agosto 2023'
          ].map<DropdownMenuItem<String>>((String value) {
            return DropdownMenuItem<String>(
              value: value,
              child: Text(value),
            );
          }).toList(),
        ),
        ElevatedButton.icon(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => PaginaCreaEvento()),
            );
          },
          icon: Icon(Icons.add_circle, size: 18),
          label: Text("AGGIUNGI EVENTO"),
          style: ElevatedButton.styleFrom(
            shadowColor: Colors.blue,
            primary: Colors.blue[900],
          ),
        ),
        SizedBox(height: 5),
        EventiWidget(ms!),
      ],
    );
  }
}

这是EventWidget代码的一部分

代码语言:javascript
复制
 // ignore: must_be_immutable
    class EventiWidget extends StatefulWidget {
      String meseAttualeEventi;
    
      EventiWidget(this.meseAttualeEventi);
    
      @override
      State<StatefulWidget> createState() {
        return EventiWidget2(meseAttualeEventi);
      }
    }
    
    class EventiWidget2 extends State<EventiWidget> {
  String meseAttualeEventi;

  EventiWidget2(this.meseAttualeEventi);
  List<Map<String, dynamic>> datiEventi = [];

  aggiornaWidgetEventi() async {
    if (meseAttualeEventi == "Agosto 2022") {
      datiEventi = datiEventiAgosto2022;
    } else if (meseAttualeEventi == "Settembre 2022") {
      datiEventi = datiEventiSettembre2022;
    } else if (meseAttualeEventi == "Ottobre 2022") {
      datiEventi = datiEventiOttobre2022;
    } else if (meseAttualeEventi == "Novembre 2022") {
      datiEventi = datiEventiNovembre2022;
    } else if (meseAttualeEventi == "Dicembre 2022") {
      datiEventi = datiEventiDicembre2022;
    } else if (meseAttualeEventi == "Gennaio 2023") {
      datiEventi = datiEventiGennaio2023;
    } else if (meseAttualeEventi == "Febbraio 2023") {
      datiEventi = datiEventiFebbraio2023;
    } else if (meseAttualeEventi == "Marzo 2023") {
      datiEventi = datiEventiMarzo2023;
    } else if (meseAttualeEventi == "Aprile 2023") {
      datiEventi = datiEventiAprile2023;
    } else if (meseAttualeEventi == "Maggio 2023") {
      datiEventi = datiEventiMaggio2023;
    } else if (meseAttualeEventi == "Giugno 2023") {
      datiEventi = datiEventiGiugno2023;
    } else if (meseAttualeEventi == "Luglio 2023") {
      datiEventi = datiEventiLuglio2023;
    } else if (meseAttualeEventi == "Agosto 2023") {
      datiEventi = datiEventiAgosto2023;
    }

    List<String> split = meseAttualeEventi.split(' ');
    String _mese = split[0];
    String _anno = split[1];
    await aggiornaEventi(_mese, _anno);
    await ordinaEventi(datiEventi);
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    aggiornaWidgetEventi();
  }

  @override
  Widget build(BuildContext context) {
    double larghezza = MediaQuery.of(context).size.width;
    return Expanded(
      child: ListView.builder(
          itemCount: datiEventi.length,
          shrinkWrap: true,
          padding: EdgeInsets.all(20),
          itemBuilder: (BuildContext context, int index) {
            String? A = datiEventi[index]['A'];
            String? B = datiEventi[index]['B'];
            String? C = datiEventi[index]['C'];
            String? D = datiEventi[index]['D'];
            String? E = datiEventi[index]['E'];
            String? data = datiEventi[index]['data'];
            return Card(
                elevation: 10.0,
                color: Colors.blue[700],
                child: Container(
                    padding: EdgeInsets.only(
                        top: 10,
                        bottom: 10,
                        left: larghezza / 8,
                        right: larghezza / 8),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Text(
                          "$data",
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 15,
                              color: Colors.black,
                              fontStyle: FontStyle.italic),
                        ),
                        SizedBox(height: 10),
                        Text(
                          "A: $A     B: $B\nC: $C     D: $D\nE: $E",
                          style: TextStyle(fontSize: 15, color: Colors.black),
                          textAlign: TextAlign.center,
                        ),
                      ],
                    )));
          }),
    );
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-16 08:25:48

问题是EventiWidget2正在重新声明meseAttualeEventi。只需删除它并通过widget.meseAttualeEventi引用它。此外,重写didUpdateWidget方法以检查所选日期是否已更改,并再次调用异步函数来刷新数据。

要修复它,请执行以下操作:

代码语言:javascript
复制
class EventiWidget extends StatefulWidget {
  String meseAttualeEventi;

  EventiWidget(this.meseAttualeEventi);

  @override
  State<StatefulWidget> createState() {
    return EventiWidget2();
  }
}

class EventiWidget2 extends State<EventiWidget> {
  List<Map<String, dynamic>> datiEventi = [];

  aggiornaWidgetEventi() async {
    if (widget.meseAttualeEventi == "Agosto 2022") {
      datiEventi = datiEventiAgosto2022;
    } else if (widget.meseAttualeEventi == "Settembre 2022") {
      datiEventi = datiEventiSettembre2022;
    } else if (widget.meseAttualeEventi == "Ottobre 2022") {
      datiEventi = datiEventiOttobre2022;
    } else if (widget.meseAttualeEventi == "Novembre 2022") {
      datiEventi = datiEventiNovembre2022;
    } else if (widget.meseAttualeEventi == "Dicembre 2022") {
      datiEventi = datiEventiDicembre2022;
    } else if (widget.meseAttualeEventi == "Gennaio 2023") {
      datiEventi = datiEventiGennaio2023;
    } else if (widget.meseAttualeEventi == "Febbraio 2023") {
      datiEventi = datiEventiFebbraio2023;
    } else if (widget.meseAttualeEventi == "Marzo 2023") {
      datiEventi = datiEventiMarzo2023;
    } else if (widget.meseAttualeEventi == "Aprile 2023") {
      datiEventi = datiEventiAprile2023;
    } else if (widget.meseAttualeEventi == "Maggio 2023") {
      datiEventi = datiEventiMaggio2023;
    } else if (widget.meseAttualeEventi == "Giugno 2023") {
      datiEventi = datiEventiGiugno2023;
    } else if (widget.meseAttualeEventi == "Luglio 2023") {
      datiEventi = datiEventiLuglio2023;
    } else if (widget.meseAttualeEventi == "Agosto 2023") {
      datiEventi = datiEventiAgosto2023;
    }

    List<String> split = widget.meseAttualeEventi.split(' ');
    String _mese = split[0];
    String _anno = split[1];
    await aggiornaEventi(_mese, _anno);
    await ordinaEventi(datiEventi);
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    aggiornaWidgetEventi();
  }

  @override
  void didUpdateWidget(covariant EventiWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (oldWidget.meseAttualeEventi != widget.meseAttualeEventi) {
      aggiornaWidgetEventi();
    }
  }

  @override
  Widget build(BuildContext context) {
    double larghezza = MediaQuery.of(context).size.width;
    return Expanded(
      child: ListView.builder(
          itemCount: datiEventi.length,
          shrinkWrap: true,
          padding: EdgeInsets.all(20),
          itemBuilder: (BuildContext context, int index) {
            String? A = datiEventi[index]['A'];
            String? B = datiEventi[index]['B'];
            String? C = datiEventi[index]['C'];
            String? D = datiEventi[index]['D'];
            String? E = datiEventi[index]['E'];
            String? data = datiEventi[index]['data'];
            return Card(
                elevation: 10.0,
                color: Colors.blue[700],
                child: Container(
                    padding: EdgeInsets.only(
                        top: 10,
                        bottom: 10,
                        left: larghezza / 8,
                        right: larghezza / 8),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Text(
                          "$data",
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              fontSize: 15,
                              color: Colors.black,
                              fontStyle: FontStyle.italic),
                        ),
                        SizedBox(height: 10),
                        Text(
                          "A: $A     B: $B\nC: $C     D: $D\nE: $E",
                          style: TextStyle(fontSize: 15, color: Colors.black),
                          textAlign: TextAlign.center,
                        ),
                      ],
                    )));
          }),
    );
  }
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-15 20:47:58

我认为不应该是ms = newValue; setState(() {});,而是setState(() {ms = newValue;});

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73362990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档