如何在垂直列表视图中添加水平滚动网格视图?

时间:2021-02-12 12:06:38

标签: flutter dart

我正在尝试在垂直列表视图中创建这样的布局,水平网格视图:https://i.stack.imgur.com/RyqZZ.png

想要在垂直列表视图中添加水平网格视图。

我尝试使用axis.horizo​​ntal 添加gridview,但它给了我尺寸错误

下面是我的代码(想在列表视图的末尾添加一个水平网格视图):

            shrinkWrap: true,
              physics: BouncingScrollPhysics(),
              children: [
                CarouselSlider(
                  items: imageSliders,
                  options: CarouselOptions(
                    viewportFraction: 1.025,
                      autoPlay: false,
                      enlargeCenterPage: true,
                      aspectRatio: 1.5,
                      onPageChanged: (index, reason) {
                        setState(() {
                          _current = index;
                        });
                      }
                  ),
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: imgList.map((url) {
                    int index = imgList.indexOf(url);
                    return Container(
                      width: 8.0,
                      height: 8.0,
                      margin: EdgeInsets.symmetric(vertical: 10.0, horizontal: 2.0),
                      decoration: BoxDecoration(
                        border: Border.all(color: systemWideBlueColor, width: 1), //
                        shape: BoxShape.circle,
                        color: _current == index
                            ? systemWideBlueColor
                            : Colors.white,
                      ),
                    );
                  }).toList(),
                ),


                //Product title, price and quantity
                Row(
                  children: [
                    Padding(
                      padding: const EdgeInsets.only(left: 24.0, top: 18.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            'Polarised Camera',
                            style: productNameTextStyle,
                          ),
                          SizedBox(height: 5,),
                          Text(
                            'Lorem Ipsum Lorem Ipsum ',
                            style: productSubNameTextStyle,
                          ),
                          SizedBox(height: 5,),
                          Row(
                            // mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              Text(
                                "\$100",
                                style: productPriceTextStyle,
                              ),
                              SizedBox(width: 3),
                              Text(
                                "\$200",
                                style: productCutPriceTextStyle,
                              ),
                              SizedBox(width: 4),
                              Text(
                                '50% Off',
                                style: kSubtitleStyle,
                              )
                            ],
                          ),
                          SizedBox(height: 5,),
                          Text(
                            'Inclusive of Tax',
                            style: productSubNameTextStyle,
                          ),
                        ],
                      ),
                    ),
                    SizedBox (width: 15,),
                    Padding(
                      padding: const EdgeInsets.only(left: 24.0, top: 18.0),
                      child: Container(height: 30,
                      color: Color(0xFF59A4E9),
                      child: Padding(
                        padding: const EdgeInsets.symmetric(horizontal: 8.0),
                        child: Center(
                          child: Text('Over 400 available', style: TextStyle(color: Colors.white),),
                        ),
                      ),)
                    ),
                  ],
                ),

                //Product color variant
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                  child: Text('Color Variant', style: kBasicBlueTextStyle,),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 8.0),
                  child: GroupButton(
                    spacing: 5,
                    isRadio: true,
                    direction: Axis.horizontal,
                    onSelected: (index, isSelected) =>
                        print('$index button is ${isSelected ? 'selected' : 'unselected'}'),
                    buttons: ["Red","Blue","Green","Yellow"],
                    selectedButtons: null,
                    selectedTextStyle: kBasicWhiteTextStyle,
                    unselectedTextStyle: kBasicSmallTextStyle,
                    selectedColor: systemWideBlueColor,
                    unselectedColor: Colors.white,
                    // selectedBorderColor: Colors.red,
                    unselectedBorderColor: systemWideBlueColor,
                    borderRadius: BorderRadius.circular(0.0),
                    selectedShadow: <BoxShadow>[BoxShadow(color: Colors.transparent)],
                    unselectedShadow: <BoxShadow>[BoxShadow(color: Colors.transparent)],
                  )
                ),


                //Product size variant
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                  child: Text('Size', style: kBasicBlueTextStyle,),
                ),
                Padding(
                    padding: const EdgeInsets.only(left: 24.0, top: 8.0),
                    child: GroupButton(
                      spacing: 5,
                      isRadio: true,
                      direction: Axis.horizontal,
                      onSelected: (index, isSelected) =>
                          print('$index button is ${isSelected ? 'selected' : 'unselected'}'),
                      buttons: ["XXS","S","M","L","XL","XXL"],
                      selectedButtons: null,
                      selectedTextStyle: kBasicWhiteTextStyle,
                      unselectedTextStyle: kBasicSmallTextStyle,
                      selectedColor: systemWideBlueColor,
                      unselectedColor: Colors.white,
                      // selectedBorderColor: Colors.red,
                      unselectedBorderColor: systemWideBlueColor,
                      borderRadius: BorderRadius.circular(0.0),
                      selectedShadow: <BoxShadow>[BoxShadow(color: Colors.transparent)],
                      unselectedShadow: <BoxShadow>[BoxShadow(color: Colors.transparent)],
                    )
                ),

                //Product Detailed description
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                  child: Text('Description', style: kBasicBlueTextStyle,),
                ),
                Padding(
                    padding: const EdgeInsets.only(left: 14.0, top: 0.0),
                    child: Container(
                      child: new DescriptionTextWidget(text: description),
                    ),
                ),


                //Product Customer Reviews
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                  child: Text('Customer Reviews', style: kBasicBlueTextStyle,),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 24.0, top: 8.0),
                  child: Row(
                    children: [
                      Text('4.0', style: kBasicTextStyle,),
                      SmoothStarRating(
                          allowHalfRating: false,
                          onRated: (v) {
                          },
                          starCount: 5,
                          rating: 4,
                          size: 20.0,
                          isReadOnly:true,
                          // filledIconData: Icons.blur_off,
                          // halfFilledIconData: Icons.blur_on,
                          color: Color(0xFFFFA217),
                          borderColor: Color(0xFFFFA217),
                          spacing:0.0
                      ),
                      Text('48 reviews', style: kBasicTextStyle,),
                    ],
                  )
                ),
                Padding(
                    padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                    child: Row(
                      children: [
                        Icon(CupertinoIcons.profile_circled),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: Text('Shivam Shrivastava', style: kBasicBlueTextStyle,),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: SmoothStarRating(
                              allowHalfRating: false,
                              onRated: (v) {
                              },
                              starCount: 5,
                              rating: 5,
                              size: 15.0,
                              isReadOnly:true,
                              // filledIconData: Icons.blur_off,
                              // halfFilledIconData: Icons.blur_on,
                              color: Color(0xFFFFA217),
                              borderColor: Color(0xFFFFA217),
                              spacing:0.0
                          ),
                        ),
                      ],
                    )
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0),
                  child: Text('3 Months Ago', style: kBasicSmallTextStyle,),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0, right: 8.0),
                  child: Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Porttitor erat urna pharetra, ipsum. Sed etiam consequat risus aliquam. Amet scelerisque lorem lacus, sapien, ut ornare...', style: kBasicSmallTextStyle,),
                ),


                //Product Customer Reviews
                Padding(
                    padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                    child: Row(
                      children: [
                        Icon(CupertinoIcons.profile_circled),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: Text('Shivam Shrivastava', style: kBasicBlueTextStyle,),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: SmoothStarRating(
                              allowHalfRating: false,
                              onRated: (v) {
                              },
                              starCount: 5,
                              rating: 5,
                              size: 15.0,
                              isReadOnly:true,
                              // filledIconData: Icons.blur_off,
                              // halfFilledIconData: Icons.blur_on,
                              color: Color(0xFFFFA217),
                              borderColor: Color(0xFFFFA217),
                              spacing:0.0
                          ),
                        ),
                      ],
                    )
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0),
                  child: Text('3 Months Ago', style: kBasicSmallTextStyle,),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0, right: 8.0),
                  child: Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Porttitor erat urna pharetra, ipsum. Sed etiam consequat risus aliquam. Amet scelerisque lorem lacus, sapien, ut ornare...', style: kBasicSmallTextStyle,),
                ),


                //Product Customer Reviews
                Padding(
                    padding: const EdgeInsets.only(left: 24.0, top: 28.0),
                    child: Row(
                      children: [
                        Icon(CupertinoIcons.profile_circled),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: Text('Shivam Shrivastava', style: kBasicBlueTextStyle,),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(left: 8.0),
                          child: SmoothStarRating(
                              allowHalfRating: false,
                              onRated: (v) {
                              },
                              starCount: 5,
                              rating: 5,
                              size: 15.0,
                              isReadOnly:true,
                              // filledIconData: Icons.blur_off,
                              // halfFilledIconData: Icons.blur_on,
                              color: Color(0xFFFFA217),
                              borderColor: Color(0xFFFFA217),
                              spacing:0.0
                          ),
                        ),
                      ],
                    )
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0),
                  child: Text('3 Months Ago', style: kBasicSmallTextStyle,),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 54.0, top: 8.0, right: 8.0),
                  child: Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Porttitor erat urna pharetra, ipsum. Sed etiam consequat risus aliquam. Amet scelerisque lorem lacus, sapien, ut ornare...', style: kBasicSmallTextStyle,),
                ),

                //Show all reviews
                Row(
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    Padding(
                      padding: const EdgeInsets.only(right: 24.0, top: 28.0),
                      child: Text('Show All Reviews', style: kBasicBlueBoldTextStyle,),
                    ),
                  ],
                ),
                
                // Gridview will come here
                SizedBox(height: 100,),
              ]
          ),```

1 个答案:

答案 0 :(得分:0)

为了获得图像中显示的结果,最好的方法是使用 ListView() 而不是使用 GridView

您只需在普通 ListView 中添加一行代码即可轻松实现所需的输出。 您需要在 ListView 中添加的行是

scrollDirection: Axis.horizontal

这将完成您的工作。

相关问题