gpt4 book ai didi

Flutter setState() 只调用一次

转载 作者:IT王子 更新时间:2023-10-29 07:18:38 24 4
gpt4 key购买 nike

这是我的代码:

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

修改后程序还是一样的bug。

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

请记住,我是 Flutter 的初学者,我很容易出错和出错。

最佳答案

那是因为每次刷新小部件时,build 方法都会被调用,然后您的变量 listy 会再次被赋值为 0。

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

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

 var listy = 0;

Widget build(BuildContext context){
...


关于Flutter setState() 只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56512141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com