Я пытаюсь обновить свой список во флаттере после удаления любых данных в списке с помощью кнопки удаления, но он не может обновить список
Я пытаюсь обновить свой список во флаттере после удаления любых данных в списке с помощью кнопки удаления, и он удаляет, но не удаляется из списка, когда я перезапускаю приложение, которое исчезает. Но я хочу, чтобы всякий раз, когда я нажимал кнопку удаления, он удаляет немедленно не перезапускать приложение. как я могу решить эту проблему, мне подсказывают?
Вот мой код списка?
var dbHelper = DatabaseHelper.instance;
var myList = List();
List<Widget> itemData = [];
var indexPosition;
Future<bool> getPostsData() async {
myList = [];
itemData = [];
var responseList = await dbHelper.queryAll();
List<Widget> listItems = [];
responseList.forEach((row) {
listItems.add(
Container(
width: 400,
height: 150,
margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(20.0)),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(100), blurRadius: 10.0),
]),
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 0, vertical: 2),
child: Text(
row['codetype'],
maxLines: 1,
style: TextStyle(
color: Colors.black26, fontSize: 20),
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 5, vertical: 2),
child: Text(
' /',
maxLines: 1,
style: TextStyle(color: Colors.black26),
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 0, vertical: 2),
child: Text(
row['datatype'],
maxLines: 1,
style: TextStyle(
color: Colors.black26, fontSize: 20),
),
),
],
),
Row(
children: <Widget>[
InkWell(
onTap: () {
setState(() {
pinned = pinned ? false : true;
Fluttertoast.showToast(msg: "Data: $pinned");
});
// pinnedData();
},
child: Padding(
padding: const EdgeInsets.all(5),
child: Image.asset(
pinned
? "assets/images/pin.png"
: "assets/images/unpin.png",
height: 20,
width: 20,
),
)),
],
)
],
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 5, 0, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 0, vertical: 2),
child: AutoSizeText(
row['datadescription'],
maxLines: 2,
minFontSize: 10,
maxFontSize: 26,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.black, fontSize: 26),
),
),
],
),
Row(
children: <Widget>[
InkWell(
onTap: () {
String listId1 = "$row[]";
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ListResult(
listId: listId1,
)));
setState(() {});
},
child: Padding(
padding: const EdgeInsets.all(5),
child: Image.asset(
"assets/images/arrow.png",
height: 40,
width: 20,
),
))
],
)
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
InkWell(
onTap: () {
// print("share");
String shareTitle = row['datatype'];
String shareSubject = row['datadescription'];
shareData(context, shareTitle, shareSubject);
},
child: Padding(
padding: const EdgeInsets.all(5),
child: Image.asset(
"assets/images/share.png",
height: 25,
width: 25,
),
)),
InkWell(
onTap: () {
print("delete");
_delete(context, row['id']);
Fluttertoast.showToast(
msg: "Data deleted",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.blue,
textColor: Colors.white,
fontSize: 14.0);
// dbHelper.deletedata(row['id']);
setState(() {});
},
child: Padding(
padding: const EdgeInsets.all(5),
child: Image.asset(
"assets/images/trash.png",
height: 25,
width: 25,
),
)),
],
),
Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 0, vertical: 2),
child: Text(
row['date'],
style: TextStyle(
color: Colors.black26, fontSize: 20),
),
),
],
)
],
)
],
),
)),
);
});
//pass data one screen to another screen
getNavigation(BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => resultScanner(
scanResult: scannedResult,
resultType: resultType,
currentTime: currentTime,
)));
}
setState(() {
itemData = listItems;
});
return Future.value(true);
}
Здесь код состояния инициализации
@override
void initState() {
super.initState();
setState(() {
getPostsData();
});
controller.addListener(() {
double value = controller.offset / 119;
setState(() {
topContainer = value;
closeTopContainer = controller.offset > 50;
});
});
_currentScreen();
}
А это код построителя списков
Expanded(
child: ListView.builder(
controller: controller,
itemCount: itemData.length,
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) {
/* double scale = 1.0;
if (topContainer > 0.5) {
scale = index + 0.5 - topContainer;
if (scale < 0) {
scale = 0;
} else if (scale > 1) {
scale = 1;
}
}*/
return itemData[index];
/*Opacity(
opacity: scale,
child: Transform(
transform: Matrix4.identity()..scale(scale, scale),
alignment: Alignment.bottomCenter,
child: Align(
heightFactor: 0.7,
alignment: Alignment.topCenter,
child: itemData[index]),
),
);*/
})),
Вот мой код метода удаления
void _delete(BuildContext context, int id) async {
int result = await dbHelper.deletedata(id);
if (result != 0) {
_showSnackBar(context, 'Data Deleted Successfully');
updateListView();
}
}
Вот мой код списка обновлений
void updateListView() {
final Future<Database> dbFuture = dbHelper.initializeDatabase();
dbFuture.then((database) {});
}
3 ответа
Вызов getPostsData
в updateListView
.
void updateListView() {
final Future<Database> dbFuture = dbHelper.initializeDatabase();
dbFuture.then((database) {});
getPostsData();
}
Я думаю, что добавление setState в updateListView() должно сделать это.
void updateListView() {
final Future<Database> dbFuture = dbHelper.initializeDatabase();
dbFuture.then((database) {});
setState((){});
}
Изменить: похоже, вы получаете данные своей базы данных только один раз в initState. Возможно, вам нужно повторно запустить функцию, которая получает данные каждый раз, когда вы что-то удаляете.
Не базовый способ, но вы можете добавить кнопку для обновления списка после удаления и вызвать setState с getPostsData, который обновит элементы. Для лучшего решения вы можете использовать провайдера и уведомлять слушателей каждый раз, когда вы делаете удаление.