Я получаю сообщение об ошибке «Неправильное использование ParentDataWidget».

И списки не показывают элемент в первый раз.

ParentDataWidget Expanded (flex: 1) хочет применить ParentData типа FlexParentData к RenderObject, который был настроен для приема ParentData несовместимого типа ParentData.

Обычно это означает, что расширенный виджет имеет неправильного предка RenderObjectWidget. Как правило, расширенные виджеты размещаются непосредственно внутри виджетов Flex. Оскорбительный Expanded в настоящее время помещается в виджет ConstrainedBox.

@override
Widget build(BuildContext context) {
 return Scaffold(
     appBar: AppBar(
       actions: <Widget>[
         IconButton(
           icon: Icon(Icons.shopping_cart),
           onPressed: () {},
         )
       ],
       backgroundColor: Colors.green,
     ),
     drawer: Drawer(
       child: AppDrawer(),
     ),
     body: SingleChildScrollView(
       child: ConstrainedBox(
         constraints: BoxConstraints(),
         child: Column(
           children: <Widget>[
             Container(
               height: 200,
               width: double.infinity,
               child: HomeSlider(),
             ),
             Padding(
               padding: EdgeInsets.only(top: 14.0, left: 8.0, right: 8.0),
               child: Text(
                   AppLocalizations.of(context)
                       .translate('leatest_producrs'),
                   style: TextStyle(
                       color: Theme.of(context).accentColor,
                       fontSize: 18,
                       fontWeight: FontWeight.w700)),
             ),
             Container(
               margin: EdgeInsets.symmetric(vertical: 8.0),
               height: 200.0,
               child: Expanded(
                 child: ListView.builder(
                   shrinkWrap: true,
                   scrollDirection: Axis.horizontal,
                   itemCount: cards.length,
                   itemBuilder: (BuildContext context, int index) => Card(
                     child: InkWell(
                       child: Column(
                         children: [
                           Flexible(
                             child: Container(
                               height: double.infinity,
                               width: 120,
                               decoration: BoxDecoration(
                                   image: DecorationImage(
                                 image: NetworkImage(
                                   cards[index].productImg,
                                 ),
                                 fit: BoxFit.fitHeight,
                               )),
                             ),
                           ),
                           Container(
                             width: 150,
                             padding: EdgeInsets.all(10),
                             child: Text(cards[index].productName,
                                 style: new TextStyle(fontSize: 12),
                                 softWrap: true),
                           ),
                         ],
                       ),
                       onTap: () {
                         Fluttertoast.showToast(
                             msg: cards[index].productName,
                             toastLength: Toast.LENGTH_SHORT,
                             gravity: ToastGravity.BOTTOM,
                             timeInSecForIosWeb: 1,
                             backgroundColor: Colors.white70,
                             textColor: Colors.black,
                             fontSize: 16.0);
                       },
                     ),
                   ),
                 ),
               ),
             ),
             Container(
               child: Padding(
                 padding: EdgeInsets.only(top: 6.0, left: 8.0, right: 8.0),
                 child: Image(
                   fit: BoxFit.cover,
                   image: AssetImage('assets/images/banner-1.jpg'),
                 ),
               ),
             ),
             Row(
               mainAxisAlignment: MainAxisAlignment.spaceBetween,
               children: <Widget>[
                 Padding(
                   padding: EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0),
                   child: Text('Featured Products',
                       style: TextStyle(
                           color: Theme.of(context).accentColor,
                           fontSize: 18,
                           fontWeight: FontWeight.w700)),
                 ),
                 Padding(
                   padding: const EdgeInsets.only(
                       right: 8.0, top: 8.0, left: 8.0),
                   child: RaisedButton(
                       color: Theme.of(context).primaryColor,
                       child: Text('View All',
                           style: TextStyle(color: Colors.white)),
                       onPressed: () {
                         Navigator.pushNamed(context, '/categorise');
                       }),
                 )
               ],
             ),
             Container(
               child: GridView.count(
                 shrinkWrap: true,
                 physics: NeverScrollableScrollPhysics(),
                 crossAxisCount: 2,
                 padding:
                     EdgeInsets.only(top: 8, left: 6, right: 6, bottom: 12),
                 children: List.generate(cards.length, (index) {
                   return Container(
                     child: Card(
                       clipBehavior: Clip.antiAlias,
                       child: InkWell(
                         onTap: () {
                           print('Card tapped.');
                         },
                         child: Column(
                           crossAxisAlignment: CrossAxisAlignment.start,
                           children: <Widget>[
                             Flexible(
                               child: Container(
                                 height: double.infinity,
                                 width: double.infinity,
                                 decoration: BoxDecoration(
                                     image: DecorationImage(
                                   image: NetworkImage(
                                     cards[index].productImg,
                                   ),
                                   fit: BoxFit.fitHeight,
                                 )),
                               ),
                             ),
                             ListTile(
                                 title: Text(
                               cards[index].productName,
                               style: TextStyle(
                                   fontWeight: FontWeight.w700,
                                   fontSize: 12),
                             )),
                           ],
                         ),
                       ),
                     ),
                   );
                 }),
               ),
             ),
             Container(
               child: Padding(
                 padding: EdgeInsets.only(
                     top: 6.0, left: 8.0, right: 8.0, bottom: 10),
                 child: Image(
                   fit: BoxFit.cover,
                   image: AssetImage('assets/images/banner-2.jpg'),
                 ),
               ),
             )
           ],
         ),
       ),
     ));


Коды ошибок


══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.
The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a
RenderObject, which has been set up to accept ParentData of incompatible type ParentData.
Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically,
Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside a ConstrainedBox widget.
The ownership chain for the RenderObject that received the incompatible parent data was:
  RepaintBoundary ← NotificationListener<ScrollNotification> ← GlowingOverscrollIndicator ←
Scrollable ← ListView ← Expanded ← ConstrainedBox ← Padding ← Container ← Column ← ⋯

When the exception was thrown, this was the stack:
.
.
.
.
(elided 4 frames from class _RawReceivePortImpl, class _Timer, and dart:async-patch)
════════════════════════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.

The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject, which has been set up to accept ParentData of incompatible type ParentData.

Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside a ConstrainedBox widget.

The ownership chain for the RenderObject that received the incompatible parent data was:
  RepaintBoundary ← NotificationListener<ScrollNotification> ← GlowingOverscrollIndicator ← Scrollable ← ListView ← Expanded ← ConstrainedBox ← Padding ← Container ← Column ← ⋯
When the exception was thrown, this was the stack: 
#0      RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:5689:11)
#1      RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:5705:6)
#2      ParentDataElement._applyParentData.applyParentDataToChild (package:flutter/src/widgets/framework.dart:4939:15)
#3      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4600:14)
#4      ParentDataElement._applyParentData.applyParentDataToChild (package:flutter/src/widgets/framework.dart:4942:15)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
0
awshakam98 7 Окт 2020 в 22:17

2 ответа

Лучший ответ

Вы можете скопировать и вставить полный код ниже
В вашем случае вам не нужно Expanded, потому что вы уже установили для Container height значение 200
фрагмент кода

Container(
        margin: EdgeInsets.symmetric(vertical: 8.0),
        height: 200.0,
        child: ListView.builder(

Рабочая демонстрация

enter image description here

Полный код

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class CardItem {
  String productImg;
  String productName;

  CardItem({this.productImg, this.productName});
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  List<CardItem> cards = [
    CardItem(productImg: "https://picsum.photos/250?image=9", productName: "a"),
     CardItem(
        productImg: "https://picsum.photos/250?image=10", productName: "b"),
    CardItem(
        productImg: "https://picsum.photos/250?image=11", productName: "c"),
    CardItem(
        productImg: "https://picsum.photos/250?image=12", productName: "d"),
    CardItem(
        productImg: "https://picsum.photos/250?image=13", productName: "e"),
    CardItem(
        productImg: "https://picsum.photos/250?image=14", productName: "f"),
    CardItem(
        productImg: "https://picsum.photos/250?image=15", productName: "g"),
    CardItem(
        productImg: "https://picsum.photos/250?image=16", productName: "h")
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.shopping_cart),
              onPressed: () {},
            )
          ],
          backgroundColor: Colors.green,
        ),
        /* drawer: Drawer(
          child: AppDrawer(),
        ),*/
        body: SingleChildScrollView(
            child: ConstrainedBox(
              constraints: BoxConstraints(),
              child: Column(
                children: <Widget>[
                  Container(
                    height: 200,
                    width: double.infinity,
                    child: Text("HomeSlider()"),
                  ),
                  Padding(
                    padding: EdgeInsets.only(top: 14.0, left: 8.0, right: 8.0),
                    child: Text(
                        'leatest_producrs',
                        style: TextStyle(
                            color: Theme.of(context).accentColor,
                            fontSize: 18,
                            fontWeight: FontWeight.w700)),
                  ),
                  Container(
                    margin: EdgeInsets.symmetric(vertical: 8.0),
                    height: 200.0,
                    child: ListView.builder(
                      shrinkWrap: true,
                      scrollDirection: Axis.horizontal,
                      itemCount: cards.length,
                      itemBuilder: (BuildContext context, int index) => Card(
                        child: InkWell(
                          child: Column(
                            children: [
                              Flexible(
                                child: Container(
                                  height: double.infinity,
                                  width: 120,
                                  decoration: BoxDecoration(
                                      image: DecorationImage(
                                        image: NetworkImage(
                                          cards[index].productImg,
                                        ),
                                        fit: BoxFit.fitHeight,
                                      )),
                                ),
                              ),
                              Container(
                                width: 150,
                                padding: EdgeInsets.all(10),
                                child: Text(cards[index].productName,
                                    style: new TextStyle(fontSize: 12),
                                    softWrap: true),
                              ),
                            ],
                          ),
                          onTap: () {

                          },
                        ),
                      ),
                    ),
                  ),
                  Container(
                    child: Padding(
                      padding: EdgeInsets.only(top: 6.0, left: 8.0, right: 8.0),
                      child: Image(
                        fit: BoxFit.cover,
                        image: AssetImage('assets/images/banner-1.jpg'),
                      ),
                    ),
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0),
                        child: Text('Featured Products',
                            style: TextStyle(
                                color: Theme.of(context).accentColor,
                                fontSize: 18,
                                fontWeight: FontWeight.w700)),
                      ),
                      Padding(
                        padding: const EdgeInsets.only(
                            right: 8.0, top: 8.0, left: 8.0),
                        child: RaisedButton(
                            color: Theme.of(context).primaryColor,
                            child: Text('View All',
                                style: TextStyle(color: Colors.white)),
                            onPressed: () {
                              Navigator.pushNamed(context, '/categorise');
                            }),
                      )
                    ],
                  ),
                  Container(
                    child: GridView.count(
                      shrinkWrap: true,
                      physics: NeverScrollableScrollPhysics(),
                      crossAxisCount: 2,
                      padding:
                      EdgeInsets.only(top: 8, left: 6, right: 6, bottom: 12),
                      children: List.generate(cards.length, (index) {
                        return Container(
                          child: Card(
                            clipBehavior: Clip.antiAlias,
                            child: InkWell(
                              onTap: () {
                                print('Card tapped.');
                              },
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  Flexible(
                                    child: Container(
                                      height: double.infinity,
                                      width: double.infinity,
                                      decoration: BoxDecoration(
                                          image: DecorationImage(
                                            image: NetworkImage(
                                              cards[index].productImg,
                                            ),
                                            fit: BoxFit.fitHeight,
                                          )),
                                    ),
                                  ),
                                  ListTile(
                                      title: Text(
                                        cards[index].productName,
                                        style: TextStyle(
                                            fontWeight: FontWeight.w700,
                                            fontSize: 12),
                                      )),
                                ],
                              ),
                            ),
                          ),
                        );
                      }),
                    ),
                  ),
                  Container(
                    child: Padding(
                      padding: EdgeInsets.only(
                          top: 6.0, left: 8.0, right: 8.0, bottom: 10),
                      child: Image(
                        fit: BoxFit.cover,
                        image: AssetImage('assets/images/banner-2.jpg'),
                      ),
                    ),
                  )
                ],
              ),
            ),
          )
        );
  }
}
1
chunhunghan 8 Окт 2020 в 03:39

Расширенный виджет должен быть прямым потомком столбца, строки или гибкого элемента. Вы завернули его в контейнер. Попробуйте поменять местами виджеты "Контейнер" и "Расширенный".

1
kazume 7 Окт 2020 в 20:11