ListView не появляются в первый раз Flutter - PullRequest
0 голосов
/ 05 июля 2019

Моя проблема в том, что: просмотр списка не появляется при первом запуске приложения, но после горячей перезагрузки он появляется.

Впервые я встречаю эту ошибку.

Это мой код:

@override
Widget build(BuildContext context) {
  return new Scaffold(
    backgroundColor: Colors.black,
    body: new ListView.builder(
        itemCount: toutesLesCartes.length,
        itemBuilder: (context, count) {
          Carte carte = toutesLesCartes[count];
          String nom = carte.nomCarte;
          String image = carte.imageCarte;
          return new Dismissible(
            key: new Key(nom),
            direction: DismissDirection.endToStart,
            child: new Container(
              margin: EdgeInsets.all(5.0),
              child: new Card(
                color: Colors.transparent,
                elevation: 10.0,
                child: new Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    new Image.network(image, width: 150.0, height: 150.0,),
                    new CustomText(nom, factor: 2.0,),
                  ],
                ),
              ),
            ),
            background: new Container(
              padding: EdgeInsets.only(right: 20.0),
              color: Colors.red,
              child: new Row(
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  new CustomText("Supprimer"),
                  new Icon(Icons.delete, color: Colors.white,)
                ],
              ),
            ),
            onDismissed: (direction) {
              setState(() {
                toutesLesCartes.removeAt(count);
                nombreCarteChoisiValeur--;
              });
            },
          );
        }
    ),
  );
}

У меня есть идея, но она странная: раньше я использовал виджет Visibility, поэтому возможно, что он исходит из возможного "кэша" приложения?

Все, что посмотрю на этот пост и поможет мне, большое спасибо!

Хорошего дня!

1 Ответ

1 голос
/ 05 июля 2019

Вероятно, потому что toutesLesCartes.length равен 0.

Вы можете проверить это с помощью отладчика или отобразить что-либо, когда длина равна 0, например

@override
Widget build(BuildContext context) {
  return new Scaffold(
    backgroundColor: Colors.black,
    body: new ListView.builder(
        itemCount: toutesLesCartes.length, //* place breakpoint here
        itemBuilder: (context, count) {
          Carte carte = toutesLesCartes[count];
          String nom = carte.nomCarte;
          String image = carte.imageCarte;

        if(toutesLesCartes == null || toutesLesCartes.length == 0){
          return CircularProgressIndicator(); //you should see loading animation if list is empty
        }
          return new Dismissible(
            key: new Key(nom),
            direction: DismissDirection.endToStart,
            child: new Container(
              margin: EdgeInsets.all(5.0),
              child: new Card(
                color: Colors.transparent,
                elevation: 10.0,
                child: new Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    new Image.network(image, width: 150.0, height: 150.0,),
                    new CustomText(nom, factor: 2.0,),
                  ],
                ),
              ),
            ),
            background: new Container(
              padding: EdgeInsets.only(right: 20.0),
              color: Colors.red,
              child: new Row(
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  new CustomText("Supprimer"),
                  new Icon(Icons.delete, color: Colors.white,)
                ],
              ),
            ),
            onDismissed: (direction) {
              setState(() {
                toutesLesCartes.removeAt(count);
                nombreCarteChoisiValeur--;
              });
            },
          );
        }
    ),
  );
}

Решением будет использование FutureBuilder

Слово предупреждения: приложение будет запускать метод сборки несколько раз, поэтому рекомендуется размещать все, что вы не хотите, чтобы его вызывали повторно (например, вызовы базы данных), вне метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...