Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Listview 从列表视图中删除小部件时如何更新列表视图?_Listview_Flutter_Refresh - Fatal编程技术网

Listview 从列表视图中删除小部件时如何更新列表视图?

Listview 从列表视图中删除小部件时如何更新列表视图?,listview,flutter,refresh,Listview,Flutter,Refresh,我是颤振的初学者,我正在尝试创建一个自定义卡片小部件列表PositionWidgetinsideFavoritewidget。每个卡的信息都是通过api获取的。我在列表的每个PositionWidget上都添加了一个delete(删除)按钮,以从列表中删除此小部件,但我不知道当按下delete(删除)按钮并从列表收藏夹中删除元素时如何刷新列表。是否有人知道如何执行此操作,或者可以链接一些资源来了解此操作?谢谢大家! class Favourites extends StatefulWidget

我是颤振的初学者,我正在尝试创建一个自定义卡片小部件列表
PositionWidget
inside
Favorite
widget。每个卡的信息都是通过api获取的。我在列表的每个PositionWidget上都添加了一个delete(删除)按钮,以从列表中删除此小部件,但我不知道当按下delete(删除)按钮并从
列表收藏夹中删除元素时如何刷新列表。是否有人知道如何执行此操作,或者可以链接一些资源来了解此操作?谢谢大家!

class Favourites extends StatefulWidget {
  @override
  _FavouritesState createState() => _FavouritesState();
}

class _FavouritesState extends State<Favourites> {

  List<String> favourites = List<String>();
  final dio = new Dio();

  Future<List<String>> getData() async {
    favourites=MySharedPreferences().favoritePositions;
    List<String> dates = List<String>();
    for (var i=0; i < favourites.length; i++) {
      Response response = await dio.get('http://...api');
      dates.add(response.data['data']);
    }
    return dates;
  }
  Widget getFavourites() {
    return FutureBuilder(
        future: getData(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            if (snapshot.data.length > 0) {
              return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (context, index) {
                    return Container(
                      padding: EdgeInsets.fromLTRB(10, 10, 10, 5),
                      height: 140,
                      width: double.maxFinite,
                        child: PositionWidget(key: new Key(index.toString()), streetName: favourites[index], date: snapshot.data[index])
                    );
                  }
              );
            } 
          }
        }
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: getFavourites(),
    );
  }
}

class PositionWidget extends StatefulWidget {
   final String streetName;
   String date;
   PositionWidget({Key key, this.streetName, this.date}) : super(key: key); 

  @override
  _PositionWidgetState createState() => _PositionWidgetState();

  ....
}


类收藏夹扩展StatefulWidget{
@凌驾
_FavoriteState createState()=>\u FavoriteState();
}
类_FavoriteState扩展状态{
列表收藏夹=列表();
最终dio=新dio();
Future getData()异步{
Favorites=MySharedPreferences().favoritePositions;
列表日期=列表();
对于(变量i=0;i0){
返回ListView.builder(
itemCount:snapshot.data.length,
itemBuilder:(上下文,索引){
返回容器(
填充:从LTRB(10,10,10,5)开始的边缘设置,
身高:140,
宽度:double.maxFinite,
子:位置小部件(键:新键(index.toString()),街道名称:收藏夹[索引],日期:快照.数据[索引])
);
}
);
} 
}
}
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:GetFavorites(),
);
}
}
类PositionWidget扩展了StatefulWidget{
最后一个字符串streetName;
字符串日期;
PositionWidget({Key-Key,this.streetName,this.date}):super(Key:Key);
@凌驾
_PositionWidgetState createState()=>\u PositionWidgetState();
....
}

所以你有了一个
StatefulWidget
——让我们好好利用它。我无法检查我的一些代码,因为我没有工作样本,而且我不在办公桌旁。但要点是:

  • 创建存储api调用结果的局部变量
  • 使用SetState对其进行更新,以便UI知道其已更新
  • 更改ListView,使其使用此新变量(_dates)
  • 如果设置了变量,则设置主体检查,而未设置则显示加载指示器
  • 在PositionWidget上创建可用于父窗口小部件的voidcallback
  • 让父窗口小部件调用一个void函数,该函数在设置state时删除指定索引处的项,以便ui知道
  • 我真的希望这段代码是正确的,如果不是,请让我知道,我可以尝试帮助:)-我已经有一段时间没有使用setState与API交互了,所以我可能在那里做了一些错误-我通常使用BLOC来管理状态,所以如果需要更多帮助,请让我知道。以下是示例代码:

    class Favourites extends StatefulWidget {
      @override
      _FavouritesState createState() => _FavouritesState();
    }
    
    class _FavouritesState extends State<Favourites> {
      List<String> _dates;
    
      List<String> favourites = List<String>();
      final dio = new Dio();
    
      Future<List<String>> getData() async {
        favourites=MySharedPreferences().favoritePositions;
        List<String> dates = List<String>();
        for (var i=0; i < favourites.length; i++) {
          Response response = await dio.get('http://...api');
          dates.add(response.data['data']);
        }
        return dates;
      }
    
      @override
      void initState() { 
        super.initState();
    
        getData().then((dates) {
          if(mounted) setState(() => _dates = dates);
        })//You should catch error here too....
      }
    
      void _deleteItem(int index) {
        if(mounted) setState(() {
          _dates.removeAt(index);
          //I assume you want to remove favorites as well otherwise the two indeces will go out of sync? Maybe?
          //favourites.removeAt(index)
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: _dates == null ?
          Center(child: CircularProgressIndicator()) :
          ListView.builder(
            itemCount: _dates.length,
            itemBuilder: (context, index) {
              return Container(
                padding: EdgeInsets.fromLTRB(10, 10, 10, 5),
                height: 140,
                width: double.maxFinite,
                  child: PositionWidget(key: new Key(index.toString()), streetName: favourites[index], date: _dates.data[index], onDelete: () => _deleteItem(index))
              );
            },
          );
        );
      }
    }
    
    class PositionWidget extends StatefulWidget {
       final String streetName;
       String date;
       final VoidCallBack onDelete;
       PositionWidget({Key key, this.streetName, this.date, @required this.onDelete}) : super(key: key); 
    
      @override
      _PositionWidgetState createState() => _PositionWidgetState();
    
      ///Wherever you have a button or gesture detector or whatever you can click/tap you can call widget.onDelete():
      ///For eg, onTap: () => widget.onDelete()
      ....
    }
    
    类收藏夹扩展StatefulWidget{
    @凌驾
    _FavoriteState createState()=>\u FavoriteState();
    }
    类_FavoriteState扩展状态{
    列出日期;
    列表收藏夹=列表();
    最终dio=新dio();
    Future getData()异步{
    Favorites=MySharedPreferences().favoritePositions;
    列表日期=列表();
    对于(变量i=0;i日期=日期);
    })//你也应该在这里发现错误。。。。
    }
    void _deleteItem(内部索引){
    如果(已安装)设置状态(){
    _删除日期(索引);
    //我想你也想删除收藏夹,否则这两个索引会不同步?也许吧?
    //收藏。删除(索引)
    });
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    正文:_dates==null?
    中心(子项:循环压缩机指示器()):
    ListView.builder(
    itemCount:_dates.length,
    itemBuilder:(上下文,索引){
    返回容器(
    填充:从LTRB(10,10,10,5)开始的边缘设置,
    身高:140,
    宽度:double.maxFinite,
    子项:PositionWidget(key:newkey(index.toString()),streetName:Favorites[索引],date:\u dates.data[索引],onDelete:()=>\u deleteItem(索引))
    );
    },
    );
    );
    }
    }
    类PositionWidget扩展了StatefulWidget{
    最后一个字符串streetName;
    字符串日期;
    最终删除;
    PositionWidget({Key-Key,this.streetName,this.date,@required-this.onDelete}):super(Key:Key);
    @凌驾
    _PositionWidgetState createState()=>\u PositionWidgetState();
    ///只要有按钮或手势检测器,或者可以单击/点击的任何东西,都可以调用widget.onDelete():
    ///例如,onTap:()=>widget.onDelete()
    ....
    }
    
    如果我像您建议的那样在onTap函数中调用widget.onDelete(),我如何将索引传递给_deleteItem(int index)?您不必这样做。创建position小部件时,回调函数是使用索引创建的-您不需要它。另外,因为ondelete是一个voidcallback,所以不能在其中传递变量。如果您确实想传递变量,我们可以编辑代码,但出于您的目的,不需要它。我很高兴。如果这个应用程序越来越大。我建议找一家提供州管理服务的公司。如果它是一个小应用程序,那么setstate很好,我发现:)