Flutter setState()仅调用一次

时间:2019-06-09 05:08:24

标签: 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 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]),
              ],
            )
          ],
        )
      )
    );
  }
}

基本上,我正在尝试制作一个卷土重来的生成器,其中用户通过文本框侮辱程序,然后程序通过ListView.builder将它们烤回。不幸的是,在测试我的代码时,没有显示该程序的侮辱。如您所见,在代码的注释下方,我试图查看变量listy(用于更改列表中的项目数)发生了什么,并意识到它仅被更新了一次。这是终端:

I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/chatty  ( 4632): uid=10091(com.example.comeback_generator) Thread-2 identical 2 lines
I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/flutter ( 4632): 1
I/chatty  ( 4632): uid=10091(com.example.comeback_generator) Thread-2 identical 1 line
I/flutter ( 4632): 1

从上方看时,您可以看到程序显然没有在更新变量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);
});

修改后,程序仍然存在相同的错误。

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

请记住,我是个初学者,容易出错和出错。

1 个答案:

答案 0 :(得分:1)

这是因为每次刷新窗口小部件时,都会调用方法build,然后将变量listy再次分配为0。

Widget build(BuildContext context){
    var listy = 0;

要解决您的问题,只需将声明移至build方法之外,如下所示:

 var listy = 0;

 Widget build(BuildContext context){
   ...