Элемент в списке не удаляется после удаления - флаттер - PullRequest
0 голосов
/ 12 апреля 2019

Удаление элемента из списка с помощью вызовов API было для меня успешным. Однако, когда я пытался удалить последний оставшийся элемент в списке, когда я нажимал, чтобы обновить, он не исчезал, как остальные после удаления.

enter image description here

Элемент все еще оставался там, хотя он дал мне код состояния 200, который показывает, что элемент был успешно удален из API.

Здесь я использую плитку расширения для отображения элементов, опцию всплывающего меню, кнопку удаления, чтобы удалить элемент при нажатии и обновить список, когда пользователь тянет для обновления.

Плитка расширения:

...

Future<Null> refresh() async {
    setState(() {
      getJsonData();
    });
    Completer<Null> completer = new Completer<Null>();
    completer.complete();

    return completer.future;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: RefreshIndicator(
            child: ListView.builder(
              itemBuilder: (BuildContext context, int index) => Card(
                    child: SingleChildScrollView(
                      child: StuffInTiles(
                        levelsData[index]['target_price'],
                      ),
                    ),
                  ),
              itemCount: levelsData.length,
            ),
            onRefresh: refresh,
          ),
        ),
      ),
    );
  }

  class StuffInTiles extends StatelessWidget {
  final double targetPrice;

  StuffInTiles(this.targetPrice);

  delete() async {
    String url = "http://35.240.193.96:8080/users";

    Map map = {
      'target_price': targetPrice,
      'user_id': 'user2'
    };

    print(await apiRequest(url, map));
  }

  Future<String> apiRequest(String url, Map jsonMap) async {
    HttpClient httpClient = new HttpClient();
    HttpClientRequest request = await httpClient.deleteUrl(Uri.parse(url));
    request.headers.set('content-type', 'application/json');
    request.add(utf8.encode(json.encode(jsonMap)));
    HttpClientResponse response = await request.close();
    String statusCode = response.statusCode.toString();
    String reply = await response.transform(utf8.decoder).join();

    print(statusCode);

    httpClient.close();
    return reply;
  }

  @override
  Widget build(BuildContext context) {
    List<dynamic> _getChildren() {
      List<Widget> children = [];
      levelsData.forEach(
        (element) {
          if (targetPrice.toString() == element['target_price'].toString()) {
            children.add(
              ListTile(
                ...
                trailing: PopUpMenu(
                  onDelete: () {
                    delete();
                  },
                ),
              ),
            );
          }
        },
      );
      return children;
    }
  }
}

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

...