Android 我能';更新列表视图

Android 我能';更新列表视图,android,flutter,Android,Flutter,这是我第一次在论坛上。。。我对颤振没有太多经验,但我正在我的一个项目中使用它 我需要创建多选列表视图,但无法更新图标。设置状态在我认为应该使用的地方是不允许的 我的Listview通过RESTAPI调用加载数据 class _SelectSongScreenState extends State<SelectSongScreen> { @override Widget build(BuildContext context) { // TODO: implement b

这是我第一次在论坛上。。。我对颤振没有太多经验,但我正在我的一个项目中使用它

我需要创建多选列表视图,但无法更新图标。设置状态在我认为应该使用的地方是不允许的

我的Listview通过RESTAPI调用加载数据

class _SelectSongScreenState extends State<SelectSongScreen> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: AppBar(
        title: Column(    
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment:CrossAxisAlignment.start,
          children: [          
            Text("Adicionar Músicas"),
            Text(widget.playlistName,style: TextStyle(fontSize: 18.0, color: Colors.orange),)
          ]
        ),
        actions: <Widget>[
          IconButton(icon: Icon(Icons.save_alt),
        ]),
      body: FutureBuilder(
          future: fetchMySongs(http.Client(), 1),
          builder: (context, snapshot){        
            if (snapshot.hasError) print(snapshot.error);
            return snapshot.hasData
                ? SongList2(songs: snapshot.data)
                : Center(child: CircularProgressIndicator());
          }),
    ); 
  }
}
class SongList2 extends StatelessWidget {
  final List<Song> songs;
  SongList2({Key key, this.songs}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ListView(      
      children: _buildListItemsFromSongs(),
    );
  }
  List<GestureDetector> _buildListItemsFromSongs(){
    int index = 0;
    var selectedSong = new Song();
    var songsSelected = new List<String>();
    var songsSelectedId = new List<String>();
    bool _isSelected = true;
    int _selectedCount = 0;

    return songs.map((song){
      var boxDecoration;

      _isSelected = false;

      var container = Container(      
        decoration: boxDecoration,
        child: new Row(
          children: <Widget>[
            new Column(
                children: <Widget>[ 
                  IconButton(            
                    icon: (_isSelected ? Icon(Icons.remove_circle,size: 40,) : Icon(Icons.add_circle,size: 40)),
                    color: (_isSelected ? Colors.red : Colors.green),
                    onPressed: () {
                        //setState(){ <================================================
                        print("You tapped in button ${song.name}");                                
                        selectedSong = song;
                        var _pos = songsSelected.indexOf(song.name);
                        if (_pos == -1){
                          songsSelected.add(song.name);
                          songsSelectedId.add(song.id.toString());
                        }else{
                          songsSelected.removeAt(_pos);
                          songsSelectedId.removeAt(_pos);
                        }
                        for (int i = 0;i <= songsSelected.length -1; i++){
                          if (songsSelected[i] == song.name) {
                            boxDecoration = new BoxDecoration(
                              color: Colors.grey[300]
                            );          
                            _isSelected = true; 
                          }
                        }
                       //}); <================================================
                    },
                  ),
                ],
            ),
            new Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Padding(
                  padding:
                      const EdgeInsets.fromLTRB(12.0, 12.0, 12.0, 6.0),
                  child: Text(
                    song.name,
                    style: TextStyle(
                        fontSize: 20.0, fontWeight: FontWeight.bold),
                  ),
                ),
                Padding(
                  padding:
                      const EdgeInsets.fromLTRB(12.0, 6.0, 12.0, 12.0),
                  child: Text(
                    song.singer,
                    style: TextStyle(fontSize: 18.0),
                  ),
                ),
              ],
            ),
          ],
        ),
      );

      index = index + 1;
      final gestureDetector = GestureDetector(
        child: container,
        onTap:(){

        }
      );
      return gestureDetector;
    }).toList();
    }  
}


class\u选择SongScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
归还新脚手架(
appBar:appBar(
标题:专栏(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(“Adicionar Músicas”),
文本(widget.playliName,样式:TextStyle(fontSize:18.0,颜色:Colors.orange),)
]
),
行动:[
图标按钮(图标:图标(Icons.save_alt),
]),
正文:未来建设者(
future:fetchMySongs(http.Client(),1),
生成器:(上下文,快照){
if(snapshot.hasError)打印(snapshot.error);
返回snapshot.hasData
?歌曲列表2(歌曲:快照数据)
:居中(子项:循环压缩机指示器());
}),
); 
}
}
类SongList2扩展了无状态小部件{
最终名单歌曲;
SongList2({Key-Key,this.songs}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
返回列表视图(
子项:\ u buildListItemsFromSongs(),
);
}
列表_buildListItemsFromSongs(){
int指数=0;
var selectedSong=新歌曲();
var songsSelected=新列表();
var songsSelectedId=新列表();
bool_isSelected=true;
int _selectedCount=0;
返回歌曲。映射((歌曲){
室内装饰;
_isSelected=false;
var container=容器(
装饰:盒子装饰,
孩子:新的一排(
儿童:[
新专栏(
儿童:[
图标按钮(
图标:(_isSelected?图标(图标。删除_圈,大小:40),):图标(图标。添加_圈,大小:40)),
颜色:(_isSelected?Colors.red:Colors.green),
已按下:(){

//setState(){必须将SongList2类更改为有状态小部件,然后才能使用setState方法更改图标