Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter flatter setState()只调用一次_Flutter_Dart - Fatal编程技术网

Flutter flatter setState()只调用一次

Flutter flatter setState()只调用一次,flutter,dart,Flutter,Dart,这是我的密码: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget{ @override State createState() => Comeback(); } class Comeback extends State<MyApp>{ Widget hello(BuildContext con

这是我的密码:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget{
  @override
  State createState() => Comeback();
}

class Comeback extends State<MyApp>{
  Widget hello(BuildContext context){
    var listInsults = ['no you', 'but this applies to you more than me', 'that insult was horrible'];
    var finalVar = listInsults.toList()..shuffle();
    return Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            CircleAvatar(
              child: Text(
                "XD"
              )
            ),
            Text(
              finalVar[0]
            )
          ]
        )
      ],
    );
  }
  Widget build(BuildContext context){
    var listy = 0;
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(
            "hi"
          )
        ),
        body: Column(
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemBuilder: (BuildContext context, int index) => hello(context),
                itemCount: listy
              ),
            ),
            Row(
              children: <Widget>[
                Expanded(
                  child: TextFormField(
                    decoration: InputDecoration(
                      hintText: "Insult me plz!"
                    )
                  ),
                ),
                RaisedButton(
                    onPressed: () {
                        setState(() {
                          listy++;
                          //where program is being printed
                          print(listy);
                        });

                    },
                    child: Icon(Icons.add_circle_outline),
                    highlightColor: Colors.amber[600]),
              ],
            )
          ],
        )
      )
    );
  }
}

在上面查看时,您可以看到程序显然没有更新变量listy。如果是的话,打印的数字会增加一个。我曾经尝试过从一个类似的项目中复制和粘贴代码,并通过更改变量和删除不必要的代码对其进行了修改

以下是我复制并粘贴的代码:

onPressed: () {
                            if(!products.contains(myController.text.toLowerCase()) && !products.contains(myController.text.toUpperCase()) && !products.contains(myController.text)) {
                              setState(() {
                                products.add(myController.text);
                                _save();
                                _read();
                              });
                            }
},
下面是我如何修改它的:

setState(() {
          listy++;
          print(listy);
});
修改后,程序仍然有相同的错误

我的程序有什么问题? 为什么程序错了? 我如何解决这个问题,避免将来出现类似的错误和不一致


请记住,我是颤振的初学者,而且我很容易出错。

这是因为每次刷新小部件时,都会调用方法
build
,然后变量listy又被指定为0

Widget build(BuildContext context){
    var listy = 0;
要解决问题,只需将声明移到
build
方法之外,如下所示:

 var listy = 0;

 Widget build(BuildContext context){
   ...


 var listy = 0;

 Widget build(BuildContext context){
   ...