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