如何在Flatter中添加/删除项目时强制ListView.builder刷新?
我知道我可以在包含如何在Flatter中添加/删除项目时强制ListView.builder刷新?,listview,flutter,Listview,Flutter,我知道我可以在包含ListView.builder的父有状态小部件屏幕上使用this.setState(),使ListView重建其列表 问题是我使用另一个子状态小部件来构建每个ListView项。flifter文档说,每当遇到相同的小部件时,树构建就会停止。这使得ListView内容无法重建 如何强制ListView使其所有子项“无效”并强制重建整个内容,而不指定键(全局键/本地键)之类的内容 编辑:简化代码 class PostList extends extends StatefulWid
ListView.builder
的父有状态小部件屏幕上使用this.setState()
,使ListView重建其列表
问题是我使用另一个子状态小部件来构建每个ListView项。flifter文档说,每当遇到相同的小部件时,树构建就会停止。这使得ListView内容无法重建
如何强制ListView使其所有子项“无效”并强制重建整个内容,而不指定键(全局键/本地键)之类的内容
编辑:简化代码
class PostList extends extends StatefulWidget {
final UserModel user;
PostList({ this.user }): super();
@override
_PostListState createState() => _PostListState();
}
class _PostListState extends State<PostList> {
UserModel _user;
List<PostModel> _posts;
final _repository = Repository();
@override
void initState() {
_user = widget.user;
_repository.fetchPosts(userId: user.id)
.then((response) => this.setState(() => _posts = response)
.catchError((onError) => debugPrint(onError);
}
addNewRandomPost() {
final newPost = PostModel(text: DateTime.now().millisecondsSinceEpoch.toString());
this.setState(() => _posts = [newPost]..addAll(_posts ?? []));
}
@override
Widget build(BuildContext context) {
return Scaffold(appBar: AppBar(title: "Post list"),
body: ListView.builder(
itemCount: (_posts?.length ?? 0) + 1,
itemBuilder: (context, index) {
if (index == 0)
return RaisedButton(child: Text("Add new random post"), onPressed: addNewRandomPost);
else if(_posts == null)
return Center(child: CircularProgressIndicator());
else
return PostCard(post: _posts[index - 1]);
}
)
}
}
class PostCard extends StatefulWidget {
final PostModel post;
PostCard ({ this.post }): super();
@override
_PostCardState createState() => _PostCardState();
}
class _PostCardState extends State<PostCard> {
PostModel _post;
@override
void initState() {
_post = widget.post;
}
@override
Widget build(BuildContext context) => Card(child:
Padding(padding: EdgeInsets.all(10), child: Text(_post.text));
}
我得到的是:
[ Add new random post ]
1580789332
1580789332
1580789332
1580789332
1580789332
你可以这样做
List your_data_container;
_yourDeleteMethod()async{
*your way of deleting*
if(response.statuscode == 200){
_fetchListContent();
}
}
_yourUpdateMethod()async{
*your way of Updating*
if(response.statuscode == 200){
_fetchListContent();
}
}
_fetchListContent()async{
*your way of fetching*
if(response.statuscode==200){
fetched_data = json.decode(response.body);
setState((){
your_data_container = *fetched_data*;
})
}
}
ListView.builder(
itemCount: your_data_container.length,
itemBuilder: (context, index){
return Container(
width: screenWidth,
height: screenHeight/15,
child: Row(
children: <Widget>[
Expanded(
child: Text(index.toString)
),
IconButton(
icon: Icon(Icons.delete, color: Colors.red)
onPressed: (){
_yourDeleteMethod();
}
),
IconButton(`
icon: Icon(Icons.edit)
onPressed: (){
_yourUpdateMethod();
}
)
]
)
);
}
)
列出您的\u数据\u容器;
_yourDeleteMethod()异步{
*你删除的方式*
如果(response.statuscode==200){
_fetchListContent();
}
}
_yourUpdateMethod()异步{
*你的更新方式*
如果(response.statuscode==200){
_fetchListContent();
}
}
_fetchListContent()异步{
*你的取回方式*
if(response.statuscode==200){
fetched_data=json.decode(response.body);
设置状态(){
您的_数据_容器=*获取的_数据*;
})
}
}
ListView.builder(
itemCount:your_data_container.length,
itemBuilder:(上下文,索引){
返回容器(
宽度:屏幕宽度,
高度:屏幕高度/15,
孩子:排(
儿童:[
扩大(
子项:文本(index.toString)
),
图标按钮(
图标:图标(Icons.delete,颜色:Colors.red)
已按下:(){
_yourDeleteMethod();
}
),
图标按钮(`
图标:图标(Icons.edit)
已按下:(){
_yourUpdateMethod();
}
)
]
)
);
}
)
注意:ListView.builder应该在build内部或作为一个小部件,这只是为了让您了解这不是全部代码您可以这样做
List your_data_container;
_yourDeleteMethod()async{
*your way of deleting*
if(response.statuscode == 200){
_fetchListContent();
}
}
_yourUpdateMethod()async{
*your way of Updating*
if(response.statuscode == 200){
_fetchListContent();
}
}
_fetchListContent()async{
*your way of fetching*
if(response.statuscode==200){
fetched_data = json.decode(response.body);
setState((){
your_data_container = *fetched_data*;
})
}
}
ListView.builder(
itemCount: your_data_container.length,
itemBuilder: (context, index){
return Container(
width: screenWidth,
height: screenHeight/15,
child: Row(
children: <Widget>[
Expanded(
child: Text(index.toString)
),
IconButton(
icon: Icon(Icons.delete, color: Colors.red)
onPressed: (){
_yourDeleteMethod();
}
),
IconButton(`
icon: Icon(Icons.edit)
onPressed: (){
_yourUpdateMethod();
}
)
]
)
);
}
)
列出您的\u数据\u容器;
_yourDeleteMethod()异步{
*你删除的方式*
如果(response.statuscode==200){
_fetchListContent();
}
}
_yourUpdateMethod()异步{
*你的更新方式*
如果(response.statuscode==200){
_fetchListContent();
}
}
_fetchListContent()异步{
*你的取回方式*
if(response.statuscode==200){
fetched_data=json.decode(response.body);
设置状态(){
您的_数据_容器=*获取的_数据*;
})
}
}
ListView.builder(
itemCount:your_data_container.length,
itemBuilder:(上下文,索引){
返回容器(
宽度:屏幕宽度,
高度:屏幕高度/15,
孩子:排(
儿童:[
扩大(
子项:文本(index.toString)
),
图标按钮(
图标:图标(Icons.delete,颜色:Colors.red)
已按下:(){
_yourDeleteMethod();
}
),
图标按钮(`
图标:图标(Icons.edit)
已按下:(){
_yourUpdateMethod();
}
)
]
)
);
}
)
注意:ListView.builder应该是内置的或作为一个小部件,这只是为了让您了解这不是全部代码您可以发布您拥有的代码吗?您是否有方法调用来刷新ListView?@Qonvex620不是通过调用setState来刷新ListView,从而触发整个树来重建自身?如果有任何方法可以手动调用ListView并强制其刷新,而不考虑其子项(例如,通过向ListView提供键并在某处调用其“强制刷新”方法),我不知道,也没有。请尝试使用有状态小部件的didUpdateWidget方法。@AmitJangid哦,好的,让我浏览一下。我不知道。你能发布你的代码吗?你有一个方法可以调用来刷新你的listview吗?@Qonvex620不是通过调用setState来刷新listview,所以它会触发整个树来重建自己?如果有任何方法可以手动调用ListView并强制其刷新,而不考虑其子项(例如,通过向ListView提供键并在某处调用其“强制刷新”方法),我不知道,也没有。请尝试使用有状态小部件的didUpdateWidget方法。@AmitJangid哦,好的,让我浏览一下。我不知道。我想我应该从一开始就为上下文提供代码。问题是,itemBuilder没有返回这样的树(我知道这种树可以正常刷新),而是返回我的另一个有状态小部件,当其父树更新时,它不会被更新。我正在为上下文添加简化代码。我想我应该从一开始就提供我的上下文代码。问题是,itemBuilder没有返回这样的树(我知道这种树可以正常刷新),而是返回我的另一个有状态小部件,当其父树更新时,它不会被更新。我正在为上下文添加简化代码。