微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有状态小部件未重建

如何解决有状态小部件未重建

在下面的代码中,有一个问候列表、一个文本小部件和一个“刷新”提升按钮。 整个应用程序是一个有状态的小部件。当用户单击“刷新”按钮时,我希望文本更改为“用户”列表中的下一个问候语。

但是,当我运行它时,文本不会改变。所发生的一切就是在终端中打印“我们有更多问候”文本。

如果你知道如何解决这个问题,请帮忙!

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 举报,一经查实,本站将立刻删除。