#flutter #flutter-layout
#трепетать #флаттер-макет
Вопрос:
Я пытаюсь создать вариант таблицы данных, чтобы строку можно было расширить дополнительной информацией. Я не нашел способа сделать это с помощью класса DataTable.
Это то, что у меня есть:
class TestPanel extends StatefulWidget { const TestPanel({Key? key}) : super(key: key); @override _TestPanelState createState() =gt; _TestPanelState(); } class _TestPanelState extends Statelt;TestPanelgt; { bool _customTileExpanded = false; @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(10), child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Row( children: const lt;Widgetgt;[ Expanded( child: Text("Header 1"), ), Expanded( child: Text("Some Header 2"), ), Expanded( child: Text(""), ) ], ), ), Expanded( child: ListView.builder( itemCount: 1, itemBuilder: (BuildContext context, int index) { return ExpansionPanelList( animationDuration: Duration(milliseconds: 1000), dividerColor: Colors.grey, elevation: 1, children: [ ExpansionPanel( body: Container( padding: EdgeInsets.all(10), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: lt;Widgetgt;[ Text( "Some text here", style: TextStyle( color: Colors.grey[700], fontSize: 15, letterSpacing: 0.3, height: 1.3), ), ], ), ), headerBuilder: (BuildContext context, bool isExpanded) { return Container( padding: EdgeInsets.all(10), child: Row( children: const lt;Widgetgt;[ Expanded( child: Text("Value 1"), ), Expanded( child: Text("Some Value 2"), ), ], ), ); }, isExpanded: _customTileExpanded, ) ], expansionCallback: (int item, bool expanded) { setState(() =gt; _customTileExpanded = !expanded); }, ); }, ), ), ], ), ); } }
Теперь это приводит к:
Как вы можете видеть, выравнивание с заголовками неверно. Я понятия не имею, как я могу убедиться, что они всегда выровнены.
Комментарии:
1. Вы ссылаетесь
Some Value 2
иSome Text here
выравниваете?2. Да, действительно. Я хочу, чтобы поведение было таким же, как у DataTable, но с расширяемыми строками. Таким образом, Некоторое значение 2 должно начинаться так же, как и некоторый заголовок 2.
3. Я думаю, что вы столкнетесь с большей проблемой, если пойдете по этому маршруту. Что вы можете сделать, так это удалить значок на расширяемой панели, чтобы у вас был тот же макет.
4. Это была моя первая попытка, но, похоже, удалить значок невозможно.
Ответ №1:
Здесь есть хитрое решение, добавив SizedBox с той же шириной значка ExpansionPanelList «включая заполнение» в конце строки заголовка, как показано ниже:
Row( children: [ Expanded( child: Row( children: const lt;Widgetgt;[ Expanded( child: Text("Header 1"), ), Expanded( child: Text("Some Header 2"), ), ], ), ), // If the Header text "Some Header 2" is longer than the Expansion Header "Some Value 2" you'll need to increase the Sizedbox width. const SizedBox( 64, //ExpansionPanelList IconContainer size: end margin 8 padding 16*2 size 24 ), ], ),
Кроме того, я не знаю, сработает ли это с вашей идеей, но у вас может быть динамическая высота строк с DataTable2
пакетом, но сначала вам нужно скопировать код пакета и вставить его в корневой каталог вашего текущего проекта, чтобы внести в него некоторые изменения «Чтобы сделать высоту строки динамической».:
- За то, что динамическая высота строки удалена
height: effectiveDataRowHeight
иheight: effectiveHeadingRowHeight
из нового файла виджета. - Вы можете добавить
constraints: BoxConstraints(minHeight: effectiveHeadingRowHeight,)
иconstraints: BoxConstraints(minHeight: effectiveDataRowHeight,)
вместо выше и использоватьdataRowHeight
параметр в качестве минимальной высоты и то же самое дляheadingRowHeight
. - Чтобы центрировать все данные в ячейках, добавьте
defaultVerticalAlignment: TableCellVerticalAlignment.middle
var dataRows
в код виджета.
Результат: Изображение
Вы также можете сделать то же самое с классом DataTable, но на шаге 3 вам нужно добавить defaultVerticalAlignment: TableCellVerticalAlignment.middle
к Table
дочернему элементу в образе: Изображение
Я предпочитаю использовать DataTable2, так как он имеет больше настроек, вы можете найти его здесь: DataTable2
После этого Вы можете добавить значок в конце строки. Если он нажат, вы добавляете новую строку с дополнительной информацией.