setState是否无法在Dart/Flutter中重新加载状态? [英] setState not reloading state in Dart / Flutter?
问题描述
我遵循了Google CodeLabs的Flutter教程-
I followed the Flutter tutorial from Google CodeLabs -
然后我尝试添加 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.
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屋!