这是我的代码:
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);
});
修改后,程序仍然存在相同的错误。
我的程序有什么问题? 程序为什么出错? 我该如何解决这个问题,避免将来出现类似的错误和矛盾?
请记住,我是个初学者,容易出错和出错。
答案 0 :(得分:1)
这是因为每次刷新窗口小部件时,都会调用方法build
,然后将变量listy再次分配为0。
Widget build(BuildContext context){
var listy = 0;
要解决您的问题,只需将声明移至build
方法之外,如下所示:
var listy = 0;
Widget build(BuildContext context){
...