setState是否无法在Dart/Flutter中重新加载状态? [英] setState not reloading state in Dart / Flutter?

查看:203
本文介绍了setState是否无法在Dart/Flutter中重新加载状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遵循了Google CodeLabs的Flutter教程-

I followed the Flutter tutorial from Google CodeLabs -

第1部分

第2部分

然后我尝试添加 SharedPreferences 来保留数据.保存数据效果很好,但删除却不行.

Then I tried adding SharedPreferences to persist data. Saving data works perfectly but deleting doesn't.

我的完整代码可在> https://github.com/deadcoder0904/上找到. flutter-startup-name-generator/

Screen 2上,通过单击垃圾桶图标删除启动名称不会立即删除数据.我必须遍历Screen 1&在Screen 2再次返回以查看被删除的项目.

On Screen 2, deleting a startup name by clicking on trash icon doesn't remove the data instantly. I have to traverse to Screen 1 & back again at Screen 2 to see the item being removed.

该错误在下面的setState中,或者您也可以查看它

The error is in setState below or you can also view it on Github with nice formatting

void _pushSaved() {
    Navigator.of(context).push(
        MaterialPageRoute<void>(
            builder: (BuildContext context) {
                final Iterable<ListTile> tiles = _saved.map(
                    (String word) {
                        return ListTile(
                            title: Row(
                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                children: <Widget>[
                                    Text(
                                        word,
                                        style: _biggerFont,
                                    ),
                                    IconButton(
                                        icon: const Icon(Icons.delete),
                                        onPressed: () {
                                            setState(() {
                                                _saved.remove(word);
                                                savePrefs(_saved);
                                            });
                                        },
                                    )
                                ],
                            ),
                        );
                    },
                );

                final List<Widget> divided = ListTile.divideTiles(
                    context: context,
                    tiles: tiles,
                ).toList();

                return Scaffold(
                    appBar: AppBar(
                        title: const Text('Saved Suggestions'),
                    ),
                    body: ListView(children: divided),
                );
            },
        ),
    );
}

setState中的

_saved.remove(word);不会立即删除启动名称.

_saved.remove(word); inside setState doesn't remove the startup name instantly.

我应该制作另一个有状态组件吗?我该怎么解决?

Should I make another stateful component? How do I solve it?

推荐答案

这是因为您在builder中创建的小部件不是Stateful.

That's because the widget you created inside builder is not Stateful.

创建一个StatefulWidget并从MaterialPageRoute调用它.

只需几处更改:

void _pushSaved() {
    Navigator.of(context).push(
      MaterialPageRoute<void>(
        builder: (BuildContext context) => FavoriteList(
            data: _saved, savePrefs: savePrefs, biggerFont: _biggerFont),
      ),
    );
  }

创建一个新的StatefulWidget

class FavoriteList extends StatefulWidget {
  final Set<String> data;
  final Function savePrefs;
  final TextStyle biggerFont;
  FavoriteList({Key key, this.data, this.savePrefs, this.biggerFont})
      : super(key: key);

  @override
  _FavoriteListState createState() => _FavoriteListState();
}

class _FavoriteListState extends State<FavoriteList> {
  Set<String> _saved;
  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  @override
  void initState() {
    _saved = widget.data;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final Iterable<ListTile> tiles = _saved.map(
      (String word) {
        return ListTile(
          title: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Text(
                word,
                style: widget.biggerFont,
              ),
              IconButton(
                icon: const Icon(Icons.delete),
                onPressed: () {
                  setState(() {
                    _saved.remove(word);
                    widget.savePrefs(_saved);
                  });
                },
              )
            ],
          ),
        );
      },
    );

    final List<Widget> divided = ListTile.divideTiles(
      context: context,
      tiles: tiles,
    ).toList();

    return Scaffold(
      appBar: AppBar(
        title: const Text('Saved Suggestions'),
      ),
      body: ListView(children: divided),
    );
  }
}

这篇关于setState是否无法在Dart/Flutter中重新加载状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆