有状态小部件不重建
Stateful widget not rebuilding
在下面的代码中,有一个问候语列表、一个文本小部件和一个 'Refresh' 高架按钮。
整个应用程序是一个有状态的小部件。当用户单击刷新按钮时,我希望文本更改为用户列表中的下一个问候语。
但是,当我 运行 它时,文本没有改变。所发生的只是 'We have more greetings' 文本在终端中打印出来。
如果你知道如何解决这个问题,请帮忙!
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
var _greetingsIndex = 0;
var _greetings = [
"Hey, how are you!",
"Trust you're fine, my friend!",
"What's up!!!",
"How are you doing!",
];
void _refreshGreetings() {
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
if (_greetingsIndex < _greetings.length) {
print('We have more greetings');
} else {
setState(() {
_greetingsIndex = 0;
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('Greetings app'),
),
body: Column(
children: [
Text(_greetings[0]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
),
));
}
}
您有错字 - 您总是显示索引为 0 的问候语。
而不是:
body: Column(
children: [
Text(_greetings[0]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
)
使用
body: Column(
children: [
// this line needed fixing
Text(_greetings[_greetingsIndex]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
)
它没有改变,因为您专门要求列表的第一个元素。状态在变化,索引也在变化,但你在代码中要求 _greetings[0]
。将 Text(_greetings[0])
更改为 Text(_greetings[_greetingsIndex])
,它应该可以正常工作。
顺便说一句,此代码在到达列表末尾时会中断,因为您在检查长度之前正在重建。
我建议移动这块
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
到 if 语句的内部,那么你的 _refreshGreetings 函数应该如下所示:
void _refreshGreetings() {
if (_greetingsIndex < _greetings.length) {
print('We have more greetings');
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
}
}
将此 Text(_greetings[0])
更改为此 => Text(_greetings[_greetingsIndex])
。
以及您对此的刷新功能:
void _refreshGreetings() {
if (_greetingsIndex < _greetings.length) {
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
print('We have more greetings');
} else {
setState(() {
_greetingsIndex = 0;
});
}
}
应该可以解决您的问题。
在下面的代码中,有一个问候语列表、一个文本小部件和一个 'Refresh' 高架按钮。 整个应用程序是一个有状态的小部件。当用户单击刷新按钮时,我希望文本更改为用户列表中的下一个问候语。
但是,当我 运行 它时,文本没有改变。所发生的只是 'We have more greetings' 文本在终端中打印出来。
如果你知道如何解决这个问题,请帮忙!
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
var _greetingsIndex = 0;
var _greetings = [
"Hey, how are you!",
"Trust you're fine, my friend!",
"What's up!!!",
"How are you doing!",
];
void _refreshGreetings() {
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
if (_greetingsIndex < _greetings.length) {
print('We have more greetings');
} else {
setState(() {
_greetingsIndex = 0;
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('Greetings app'),
),
body: Column(
children: [
Text(_greetings[0]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
),
));
}
}
您有错字 - 您总是显示索引为 0 的问候语。 而不是:
body: Column(
children: [
Text(_greetings[0]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
)
使用
body: Column(
children: [
// this line needed fixing
Text(_greetings[_greetingsIndex]),
ElevatedButton(
onPressed: _refreshGreetings, child: Text('Refresh'))
],
)
它没有改变,因为您专门要求列表的第一个元素。状态在变化,索引也在变化,但你在代码中要求 _greetings[0]
。将 Text(_greetings[0])
更改为 Text(_greetings[_greetingsIndex])
,它应该可以正常工作。
顺便说一句,此代码在到达列表末尾时会中断,因为您在检查长度之前正在重建。 我建议移动这块
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
到 if 语句的内部,那么你的 _refreshGreetings 函数应该如下所示:
void _refreshGreetings() {
if (_greetingsIndex < _greetings.length) {
print('We have more greetings');
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
}
}
将此 Text(_greetings[0])
更改为此 => Text(_greetings[_greetingsIndex])
。
以及您对此的刷新功能:
void _refreshGreetings() {
if (_greetingsIndex < _greetings.length) {
setState(() {
_greetingsIndex = _greetingsIndex + 1;
});
print('We have more greetings');
} else {
setState(() {
_greetingsIndex = 0;
});
}
}
应该可以解决您的问题。