Flutter listView 在删除项目后没有更新
Flutter listView isn't updating after deleting items
我正在使用列表视图来显示一些项目,而且我正在使用 flutter_tindercard
要在项目获得批准后批准或拒绝项目,应将其添加到批准的项目列表中,然后从列表视图中删除,对于拒绝的项目也是如此,但项目被拒绝或批准时的问题是不从列表视图中删除。
PS: 底部元素没有移动到顶部
我的代码:
import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';
class ExampleHomePage extends StatefulWidget {
@override
_ExampleHomePageState createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage>
with TickerProviderStateMixin {
List approved = [];
List refused = [];
List<String> welcomeImages = [
"https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
];
List<TinderCarder> cards = [];
CardController controller = CardController(); //Use this to trigger swap.
@override
void initState() {
// TODO: implement initState
super.initState();
cards = welcomeImages.map((element) {
return TinderCarder(
image: element,
controller: controller,
onLeftPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
onRightPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
child: ListView(
children: cards,
),
),
);
}
}
class TinderCarder extends StatelessWidget {
final String image;
Function onLeftPress;
Function onRightPress;
var controller;
TinderCarder(
{required this.image,
this.controller,
required this.onLeftPress,
required this.onRightPress});
@override
Widget build(BuildContext context) {
return Container(
height: 200,
child: TinderSwapCard(
orientation: AmassOrientation.BOTTOM,
totalNum: 1,
stackNum: 3,
swipeEdge: 4.0,
maxWidth: double.infinity,
maxHeight: MediaQuery.of(context).size.width * 0.9,
minWidth: MediaQuery.of(context).size.width * 0.8,
minHeight: MediaQuery.of(context).size.width * 0.8,
cardBuilder: (context, index) => Card(
child: Image.network(
image,
width: double.infinity,
fit: BoxFit.cover,
),
),
cardController: controller,
swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
/// Get swiping card's alignment
if (align.x < 0) {
} else if (align.x > 0) {}
},
swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
print(orientation.toString());
if (orientation == CardSwipeOrientation.LEFT) {
print("Card is LEFT swiping");
// print(welcomeImages.length);
onLeftPress();
} else if (orientation == CardSwipeOrientation.RIGHT) {
print("Card is RIGHT swiping");
// print(welcomeImages.length);
onRightPress();
}
},
),
);
}
}
已编辑
试试 setstate
import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';
class ExampleHomePage extends StatefulWidget {
@override
_ExampleHomePageState createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage>
with TickerProviderStateMixin {
List approved = [];
List refused = [];
List<String> welcomeImages = [
"https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
];
List<TinderCarder> cards = [];
CardController controller = CardController(); //Use this to trigger swap.
@override
void initState() {
// TODO: implement initState
super.initState();
cards = welcomeImages.map((element) {
return TinderCarder(
image: element,
controller: controller,
onLeftPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
onRightPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
child: SingleChildScrollView(
child: ListView(
shrinkWrap: true,
key: Key(cards.length.toString()),
physics: ScrollPhysics(),
children: cards,
),
),
),
);
}
}
class TinderCarder extends StatelessWidget {
final String image;
Function onLeftPress;
Function onRightPress;
var controller;
TinderCarder(
{ this.image,
this.controller,
this.onLeftPress,
this.onRightPress});
@override
Widget build(BuildContext context) {
return Container(
height: 200,
child: TinderSwapCard(
orientation: AmassOrientation.BOTTOM,
totalNum: 1,
stackNum: 3,
swipeEdge: 4.0,
maxWidth: MediaQuery.of(context).size.width * 0.9,
maxHeight: MediaQuery.of(context).size.width * 0.9,
minWidth: MediaQuery.of(context).size.width * 0.8,
minHeight: MediaQuery.of(context).size.width * 0.8,
cardBuilder: (context, index) => Card(
child: Image.network(
image,
width: double.infinity,
fit: BoxFit.cover,
),
),
cardController: controller,
swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
/// Get swiping card's alignment
if (align.x < 0) {
} else if (align.x > 0) {}
},
swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
print(orientation.toString());
if (orientation == CardSwipeOrientation.LEFT) {
print("Card is LEFT swiping");
// print(welcomeImages.length);
onLeftPress();
} else if (orientation == CardSwipeOrientation.RIGHT) {
print("Card is RIGHT swiping");
// print(welcomeImages.length);
onRightPress();
}
},
),
);
}
}
如果您使用的是有状态小部件,请应用 setstate() 重新构建您的小部件。
如果您想使用无状态小部件,而不是使用像 GetX 或提供者这样的状态管理。
对于 GetX,在控制器中创建可观察列表并用 obx 包装小部件,因此每当更新列表时,obx 都会再次为您构建该特定小部件。
要正确学习 GetX,请浏览由 tadas petra 创建的播放列表。
https://www.youtube.com/playlist?list=PL26uY6-lIzqkmvpNr9gMCrIvl8k5Mqrhs
我正在使用列表视图来显示一些项目,而且我正在使用 flutter_tindercard
要在项目获得批准后批准或拒绝项目,应将其添加到批准的项目列表中,然后从列表视图中删除,对于拒绝的项目也是如此,但项目被拒绝或批准时的问题是不从列表视图中删除。
PS: 底部元素没有移动到顶部
我的代码:
import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';
class ExampleHomePage extends StatefulWidget {
@override
_ExampleHomePageState createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage>
with TickerProviderStateMixin {
List approved = [];
List refused = [];
List<String> welcomeImages = [
"https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
];
List<TinderCarder> cards = [];
CardController controller = CardController(); //Use this to trigger swap.
@override
void initState() {
// TODO: implement initState
super.initState();
cards = welcomeImages.map((element) {
return TinderCarder(
image: element,
controller: controller,
onLeftPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
onRightPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
child: ListView(
children: cards,
),
),
);
}
}
class TinderCarder extends StatelessWidget {
final String image;
Function onLeftPress;
Function onRightPress;
var controller;
TinderCarder(
{required this.image,
this.controller,
required this.onLeftPress,
required this.onRightPress});
@override
Widget build(BuildContext context) {
return Container(
height: 200,
child: TinderSwapCard(
orientation: AmassOrientation.BOTTOM,
totalNum: 1,
stackNum: 3,
swipeEdge: 4.0,
maxWidth: double.infinity,
maxHeight: MediaQuery.of(context).size.width * 0.9,
minWidth: MediaQuery.of(context).size.width * 0.8,
minHeight: MediaQuery.of(context).size.width * 0.8,
cardBuilder: (context, index) => Card(
child: Image.network(
image,
width: double.infinity,
fit: BoxFit.cover,
),
),
cardController: controller,
swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
/// Get swiping card's alignment
if (align.x < 0) {
} else if (align.x > 0) {}
},
swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
print(orientation.toString());
if (orientation == CardSwipeOrientation.LEFT) {
print("Card is LEFT swiping");
// print(welcomeImages.length);
onLeftPress();
} else if (orientation == CardSwipeOrientation.RIGHT) {
print("Card is RIGHT swiping");
// print(welcomeImages.length);
onRightPress();
}
},
),
);
}
}
已编辑
试试 setstate
import 'package:flutter/material.dart';
import 'package:flutter_tindercard/flutter_tindercard.dart';
class ExampleHomePage extends StatefulWidget {
@override
_ExampleHomePageState createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage>
with TickerProviderStateMixin {
List approved = [];
List refused = [];
List<String> welcomeImages = [
"https://images.unsplash.com/photo-1631636176993-759dea1a1300?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631634176568-f543af6a41de?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw3fHx8ZW58MHx8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631691971564-adf9419d904e?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxM3x8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631641906574-24adb8594649?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHwxMnx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1593642702821-c8da6771f0c6?ixid=MnwxMjA3fDF8MHxlZGl0b3JpYWwtZmVlZHwxMXx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60",
"https://images.unsplash.com/photo-1631621461675-e61a1f28d3d6?ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw0NHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60"
];
List<TinderCarder> cards = [];
CardController controller = CardController(); //Use this to trigger swap.
@override
void initState() {
// TODO: implement initState
super.initState();
cards = welcomeImages.map((element) {
return TinderCarder(
image: element,
controller: controller,
onLeftPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
onRightPress: () {
setState(() {
cards.removeAt(element.indexOf(element));
print('index is: ' + "${element.indexOf(element)}");
print('list length: ' + cards.length.toString());
});
},
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: double.infinity,
child: SingleChildScrollView(
child: ListView(
shrinkWrap: true,
key: Key(cards.length.toString()),
physics: ScrollPhysics(),
children: cards,
),
),
),
);
}
}
class TinderCarder extends StatelessWidget {
final String image;
Function onLeftPress;
Function onRightPress;
var controller;
TinderCarder(
{ this.image,
this.controller,
this.onLeftPress,
this.onRightPress});
@override
Widget build(BuildContext context) {
return Container(
height: 200,
child: TinderSwapCard(
orientation: AmassOrientation.BOTTOM,
totalNum: 1,
stackNum: 3,
swipeEdge: 4.0,
maxWidth: MediaQuery.of(context).size.width * 0.9,
maxHeight: MediaQuery.of(context).size.width * 0.9,
minWidth: MediaQuery.of(context).size.width * 0.8,
minHeight: MediaQuery.of(context).size.width * 0.8,
cardBuilder: (context, index) => Card(
child: Image.network(
image,
width: double.infinity,
fit: BoxFit.cover,
),
),
cardController: controller,
swipeUpdateCallback: (DragUpdateDetails details, Alignment align) {
/// Get swiping card's alignment
if (align.x < 0) {
} else if (align.x > 0) {}
},
swipeCompleteCallback: (CardSwipeOrientation orientation, int index) {
print(orientation.toString());
if (orientation == CardSwipeOrientation.LEFT) {
print("Card is LEFT swiping");
// print(welcomeImages.length);
onLeftPress();
} else if (orientation == CardSwipeOrientation.RIGHT) {
print("Card is RIGHT swiping");
// print(welcomeImages.length);
onRightPress();
}
},
),
);
}
}
如果您使用的是有状态小部件,请应用 setstate() 重新构建您的小部件。 如果您想使用无状态小部件,而不是使用像 GetX 或提供者这样的状态管理。 对于 GetX,在控制器中创建可观察列表并用 obx 包装小部件,因此每当更新列表时,obx 都会再次为您构建该特定小部件。 要正确学习 GetX,请浏览由 tadas petra 创建的播放列表。 https://www.youtube.com/playlist?list=PL26uY6-lIzqkmvpNr9gMCrIvl8k5Mqrhs