Я пытаюсь обновить свой список во флаттере после удаления любых данных в списке с помощью кнопки удаления, но он не может обновить список

Я пытаюсь обновить свой список во флаттере после удаления любых данных в списке с помощью кнопки удаления, и он удаляет, но не удаляется из списка, когда я перезапускаю приложение, которое исчезает. Но я хочу, чтобы всякий раз, когда я нажимал кнопку удаления, он удаляет немедленно не перезапускать приложение. как я могу решить эту проблему, мне подсказывают?

Вот мой код списка?

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, который обновит элементы. Для лучшего решения вы можете использовать провайдера и уведомлять слушателей каждый раз, когда вы делаете удаление.

Другие вопросы по тегам