Как использовать StaggeredGridView внутри столбца в flutter?

#flutter #flutter-layout #flutter-dependencies #flutter-animation #flutter-test

#flutter #flutter-layout #flutter-зависимости #flutter-анимация #flutter-тест

Вопрос:

У меня есть код, который отлично работает без использования StaggeredGridView.count() inside Column . Кто-нибудь может мне помочь? Я совершенно новичок в flutter!

 import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'smooth_star_rating.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';

void main() => runApp(MaterialApp(
      theme: ThemeData(primaryColor: Colors.black),
      home: Home(),
    ));

class Home extends StatelessWidget {
  Container TopArtist(String imageVal, String heading, double count) {
    return Container(
      width: 200,
      child: Card(
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(15.0))),
        color: Color(0xFFf2630a),
        child: Wrap(
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ClipOval(
                child: Center(
                  child: Material(
                    elevation: 4.0,
                    shape: CircleBorder(),
                    clipBehavior: Clip.hardEdge,
                    color: Colors.transparent,
                    child: Ink.image(
                      image: AssetImage(imageVal),
                      padding: const EdgeInsets.all(8.0),
                      fit: BoxFit.cover,
                      width: 160.0,
                      height: 160.0,
                      child: InkWell(
                        onTap: () {},
                      ),
                    ),
                  ),
                ),
              ),
            ),
            ListTile(
              title: Text(
                heading,
                textAlign: TextAlign.center,
                style: TextStyle(color: Colors.white, fontFamily: 'Mulish'),
              ),
              subtitle: Center(
                child: SmoothStarRating(
                  allowHalfRating: true,
                  starCount: 5,
                  rating: count,
                  size: 20,
                  color: Colors.black,
                  borderColor: Colors.white,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Material MyItems(IconData icon, String heading, int color) {
    return Material(
      color: Colors.white,
      elevation: 14.0,
      shadowColor: Color(0x802196F3),
      borderRadius: BorderRadius.circular(24.0),
      child: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      heading,
                      style: TextStyle(color: new Color(color), fontSize: 20),
                    ),
                  ),
                  Material(
                    color: new Color(color),
                    borderRadius: BorderRadius.circular(24.0),
                    child: Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Icon(
                        icon,
                        color: Colors.white,
                        size: 30.0,
                      ),
                    ),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Project Title", style: TextStyle(color: Color(0xFFf2630a))),
        backgroundColor: Colors.white,
      ),
      body: Column(
        children: [
          Container(
            color: Colors.grey[300],
            child: Column(
              children: [
                Container(
                  color: Color(0xFFf2630a),
                  child: Padding(
                    padding: const EdgeInsets.all(18.0),
                    child: TextField(
                      decoration: InputDecoration(
                          fillColor: Colors.white,
                          filled: true,
                          border: InputBorder.none,
                          suffixIcon: Icon(Icons.search),
                          hintText: 'What are you looking for ?'),
                    ),
                  ),
                ),
                Container(
                  child: Padding(
                    padding: const EdgeInsets.all(12.0),
                    child: Text(
                      "Top Artist",
                      style: TextStyle(color: Color(0xFFf2630a), fontSize: 25),
                    ),
                  ),
                ),
                Container(
                  child: Divider(
                    color: Colors.black,
                    height: 20,
                    thickness: 3,
                    indent: 180,
                    endIndent: 180,
                  ),
                ),
                Container(
                  padding: EdgeInsets.symmetric(vertical: 20),
                  height: 300,
                  child: ListView(
                    scrollDirection: Axis.horizontal,
                    children: [
                      TopArtist("assets/avatar.jpg", "Heading", 3),
                      TopArtist("assets/avatar.jpg", "Heading", 4),
                      TopArtist("assets/avatar.jpg", "Heading", 5),
                      TopArtist("assets/avatar.jpg", "Heading", 1),
                      TopArtist("assets/avatar.jpg", "Heading", 2),
                      TopArtist("assets/avatar.jpg", "Heading", 5),
                    ],
                  ),
                ),
              ],
            ),
          ),
          Container(
            child: Column(
              children: [
                Container(
                  child: Padding(
                    padding: const EdgeInsets.all(12.0),
                    child: Text(
                      "Categories",
                      style: TextStyle(color: Color(0xFFf2630a), fontSize: 25),
                    ),
                  ),
                ),
                Container(
                  child: Divider(
                    color: Colors.black,
                    height: 20,
                    thickness: 3,
                    indent: 180,
                    endIndent: 180,
                  ),
                ),
                Container(
                  child: Expanded(
                    child: StaggeredGridView.count(
                      crossAxisCount: 2,
                      crossAxisSpacing: 12.0,
                      mainAxisSpacing: 12.0,
                      padding:
                          EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
                      children: [
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                        MyItems(Icons.graphic_eq, "TotalViews", 0xffed622b),
                      ],
                      staggeredTiles: [
                        StaggeredTile.extent(1, 130),
                        StaggeredTile.extent(1, 130),
                        StaggeredTile.extent(1, 130),
                        StaggeredTile.extent(1, 130),
                        StaggeredTile.extent(1, 130),
                        StaggeredTile.extent(1, 130),
                      ],
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

 

Ответ №1:

Вы должны поместить столбец внутри виджета Material (), а также добавить очень важные свойства shrinkWrap: true, и physics: NeverScrollableScrollPhysics(),

Полный пример ниже:

 import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';

Future<List<String>> _getPictures() async {
  /// replace with your async query to your REST api.
  return [
    'https://apod.nasa.gov/apod/image/0708/hh49_spitzer_c29.jpg',
    'https://apod.nasa.gov/apod/image/1507/trifid_spitzerR1024.jpg',
    'https://apod.nasa.gov/apod/image/1409/rippledsky_dai_960.jpg'
  ];
}

class StaggeredInsideColumn extends StatefulWidget {
  const StaggeredInsideColumn({
    Key? key,
  }) : super(key: key);

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

class _StaggeredInsideColumnState extends State<StaggeredInsideColumn> {
  late final Future<List<String>> _pictureUrlList;

  @override
  void initState() {
    super.initState();
    _pictureUrlList = _getPictures();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
        child: Material(
            child: Column(children: [
      Text('hello world'),

      /// ... your other column items

      FutureBuilder<List<String>>(
          future: _pictureUrlList,
          builder: (context, AsyncSnapshot<List<String>> snapshot) {
            if (snapshot.connectionState == ConnectionState.done amp;amp;
                snapshot.hasData) {
              List<String> pictures = snapshot.data!;
              return StaggeredGridView.countBuilder(
                shrinkWrap: true,
                physics: NeverScrollableScrollPhysics(),
                crossAxisCount: 3,
                itemCount: snapshot.data!.length,
                itemBuilder: (BuildContext context, int index) => Container(
                  child: Image.network(
                    pictures[index],
                    fit: BoxFit.fitWidth,
                  ),
                ),
                staggeredTileBuilder: (int index) {
                  int tileCount = index % 7 == 0 ? 2 : 1;
                  return StaggeredTile.count(tileCount, tileCount);
                },
                mainAxisSpacing: 8.0,
                crossAxisSpacing: 8.0,
              );
            } else
              return CircularProgressIndicator();
          })
    ])));
  }
}
 

введите описание изображения здесь

Ответ №2:

Просто согласно официальным документам:

SingleChildScrollView (дочерний:
 Материал (
дочерний элемент: столбец (
дочерние элементы: [
 Контейнер (
дочерний элемент: новый StaggeredGridView.countBuilder(
crossAxisCount: 4,
ItemCount: 8,
shrinkWrap: true,
физика: NeverScrollableScrollPhysics(),
itemBuilder: (контекст BuildContext, индекс int) => новый контейнер (
цвет: Colors.green,
дочерний элемент: новый центр (
дочерний элемент: новый CircleAvatar(
backgroundColor: Цвета.белый,
дочерний элемент: новый текст ('$index'),
),
)),
staggeredTileBuilder: (int index) =>
 новый StaggeredTile.count(2, index.isEven ? 2 : 1),
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
),
)
 ]
 )
 )
 )