Как создать сетку сообщений во flutter?

#flutter #flutter-layout

#flutter #flutter-layout (флаттер-макет)

Вопрос:

Я новичок в flutter. Я хочу создать макет сетки сообщений во flutter. Я пробовал это с помощью GridView builder. Но это несовместимо с моим макетом. Мой макет такой Макет.

Любой может предложить мне подходящий тип макета.

Комментарии:

1.github.com/flutter/flutter/issues/13777 pub.dartlang.org/packages/flutter_staggered_grid_view Решают ли эти ссылки вашу проблему?

Ответ №1:

Вы можете использовать SingleChildScrollView с двумя столбцами и строкой. Дерево виджетов follwing создает желаемую сетку без каких-либо дополнительных зависимостей:

 - SingleChildScrollView
  - Row
    - Column
      - Cards...
    - Column
      - Cards...
  

Вот небольшой пример отдельного кода:

ДЕМОНСТРАЦИЯ

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: SingleChildScrollView(
            child:
              Row(
                children: <Widget>[
                  Expanded(
                    child: Column(
                      children: <Widget>[
                        MyCard(),
                        MyCard(large: true),
                        MyCard(),
                        MyCard(large: true),
                      ],
                    ),
                  ),
                  Expanded(
                    child: Column(
                      children: <Widget>[
                        MyCard(large: true),
                        MyCard(),
                        MyCard(large: true),
                        MyCard(),
                        MyCard(),
                      ],
                    ),
                  )
                ],
              )
          ),
        )
      ),
    );
  }
}

class MyCard extends StatelessWidget {
  final bool large;

  MyCard({this.large = false});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(8.0),
      child: Container(
        height: large ? 60.0 : 40.0,
        color:  large ? Colors.lightBlueAccent : Colors.deepOrangeAccent,
      ),
    );
  }
}
  

Ответ №2:

вы можете использовать этот плагин:https://pub.dev/packages/flutter_staggered_grid_view

Например:

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

const List<StaggeredTile> _staggeredTiles = <StaggeredTile>[
  StaggeredTile.count(2, 2),
  StaggeredTile.count(2, 1),
  StaggeredTile.count(1, 2),
  StaggeredTile.count(1, 1),
  StaggeredTile.count(2, 2),
  StaggeredTile.count(1, 2),
  StaggeredTile.count(1, 1),
  StaggeredTile.count(3, 1),
  StaggeredTile.count(1, 1),
  StaggeredTile.count(4, 1),
];

const List<Widget> _tiles = <Widget>[
  _Example01Tile(Colors.green, Icons.widgets),
  _Example01Tile(Colors.lightBlue, Icons.wifi),
  _Example01Tile(Colors.amber, Icons.panorama_wide_angle),
  _Example01Tile(Colors.brown, Icons.map),
  _Example01Tile(Colors.deepOrange, Icons.send),
  _Example01Tile(Colors.indigo, Icons.airline_seat_flat),
  _Example01Tile(Colors.red, Icons.bluetooth),
  _Example01Tile(Colors.pink, Icons.battery_alert),
  _Example01Tile(Colors.purple, Icons.desktop_windows),
  _Example01Tile(Colors.blue, Icons.radio),
];

class Example01 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('example 01'),
        ),
        body: Padding(
            padding: const EdgeInsets.only(top: 12),
            child: StaggeredGridView.count(
              crossAxisCount: 4,
              staggeredTiles: _staggeredTiles,
              mainAxisSpacing: 4,
              crossAxisSpacing: 4,
              padding: const EdgeInsets.all(4),
              children: _tiles,
            )));
  }
}

class _Example01Tile extends StatelessWidget {
  const _Example01Tile(this.backgroundColor, this.iconData);

  final Color backgroundColor;
  final IconData iconData;

  @override
  Widget build(BuildContext context) {
    return Card(
      color: backgroundColor,
      child: InkWell(
        onTap: () {},
        child: Center(
          child: Padding(
            padding: const EdgeInsets.all(4),
            child: Icon(
              iconData,
              color: Colors.white,
            ),
          ),
        ),
      ),
    );
  }
}
  

Ответ №3:

вы должны использовать этот пакет flutter_staggered_grid_view это видео, которое показывает, как им пользоваться https://www.youtube.com/watch?v=SrGP1BdkYpkamp;t=123s для Павана Кумара.