如何在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没有返回这样的树(我知道这种树可以正常刷新),而是返回我的另一个有状态小部件,当其父树更新时,它不会被更新。我正在为上下文添加简化代码。