如何解决有状态小部件未重建
在下面的代码中,有一个问候列表、一个文本小部件和一个“刷新”提升按钮。 整个应用程序是一个有状态的小部件。当用户单击“刷新”按钮时,我希望文本更改为“用户”列表中的下一个问候语。
但是,当我运行它时,文本不会改变。所发生的一切就是在终端中打印“我们有更多问候”文本。
如果你知道如何解决这个问题,请帮忙!
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]),)
,
它不会改变,因为您特别要求列表的第一个元素。状态在变化,索引也在变化,但您在代码中要求 _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;
});
}
}
它应该可以解决您的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。