web-dev-qa-db-fra.com

Flutter - Listview.builder dans une autre Listview

Je veux que mon écran puisse défiler, alors je mets tout dans une liste.

Maintenant, je veux montrer une autre Listview à l'intérieur pour afficher les détails d'une liste. Lorsque j'essaie, une erreur est générée - "Les widgets étendus doivent être placés à l'intérieur des widgets Flex."

enter image description here

8
Ayoob Khan

Ajouter shrinkwrap: true dans listview.builder & Supprimez le haut container ou remplacez-le par column.

16
anmol.majhail

Ajout de shrinkWrap: true, physics: ScrollPhysics(), à l'intérieur de listview.builder, dans ce cas, listview.builder a besoin d'un parent développé. La physics: ScrollPhysics() lui permettra de conserver son état sans revenir aux premiers éléments. En outre, vous pouvez utiliser physics: NeverScrollableScrollPhysics(), si vous ne voulez pas que listview.builder défile par l'utilisateur.

14
CodeMemory

J'ai eu ce problème lorsque j'ai utilisé deux ListViews, l'un dans l'autre. Rien n'a fonctionné pour moi, sauf cette solution de contournement.

Dans la Listlist imbriquée, couvrez-la avec un ConstrainedBox et donnez-lui une grande hauteur. et utilisez "shrinkWrap: true" les deux ListViews. Étant donné que le film rétractable réduira l'espace supplémentaire, cette hauteur supplémentaire ne sera pas un problème.

Flexible(
  child: ListView(
    children: <Widget>[
      //other Widgets here ...
      ConstrainedBox(
        constraints: BoxConstraints(maxHeight: 1000), // **THIS is the important part**
        child: ListView.builder(
          shrinkWrap: true,
          itemBuilder: (context, index) => _buildRow(index),
          itemCount: _elements.length,
        ),
      ),
    ],
  ),
),
3
Monasha

Je veux que mon écran puisse défiler, alors je mets tout dans une liste.

Je pense que vous devriez plutôt utiliser un CustomScrollView avec des rubans.

Si c'est la première fois que vous entendez parler d'éclats, ou s'ils semblent un peu effrayants, je vous suggère de lire cet excellent article écrit par Emily Fortuna .

Dans votre cas, je ferais quelque chose comme ça:

return CustomScrollView(
  slivers: <Widget>[
    SliverToBoxAdapter(
      // Put here all widgets that are not slivers.
      child: Container(),
    ),
    // Replace your ListView.builder with this:
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return ListTile();
        },
      ),
    ),
  ],
);
1
Romain Rastel