Flutter Dart 中的 SizedBox 或 Container
Posted
技术标签:
【中文标题】Flutter Dart 中的 SizedBox 或 Container【英文标题】:SizedBox or Container in Flutter Dart 【发布时间】:2022-01-18 13:16:00 【问题描述】:我刚刚开始了我在 Flutter(Dart) 中的编码之旅。我正在尝试设计一个 UI,我已经成功了一点,但我内心平静:P
所以,实际上我正在尝试设计一个类似卡片的结构,当我点击/点击它时,它应该展开并显示更多数据和一个按钮。
最终,我成功地使用了一个名为 isExpanded 的布尔变量来更改单击时的高度。但是当我再次点击容器(Inkwell 功能)时,它会显示渲染弹性问题。
所以,我想从你们那里得到一些帮助,我只是这方面的新手,当我有足够的知识时,我保证我也会帮助别人。
所以,我需要这些设计
The design I need
The design when it is clicked, it should expand and when clicked again it shouldn't show render flex error
The design which I have somehow created lol :P
请提供一些建议,甚至是所需布局的代码,我会很高兴为您提供帮助
谢谢
【问题讨论】:
如何在订单号左侧添加倒计时加载器 Stepper Widget 可能对你有帮助 第二个选项cupertino_stepper 【参考方案1】:您不能为此使用 SizedBox 或容器。
SizedBox 主要用于给出小部件之间的大小
容器小部件主要用作父小部件,您可以在其中为子小部件实现不同的属性,如颜色、边框半径……
你要做的是:-
这可以通过多种方式实现,例如使用动画等等......
但是,我希望你检查的是 ExpansionPanel
在这里,您可以在点击时展开卡片。
使用
ExpansionPanel
时,必须使用ExpansionPanelList
所以,你可以做一个ExpansionPanel的列表。
试试这个代码:-
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget
const MyApp(Key? key) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context)
return MaterialApp(
title: _title,
home: Scaffold(
appBar: AppBar(title: const Text(_title)),
body: const MyStatefulWidget(),
),
);
// stores ExpansionPanel state information
class Item
Item(
required this.expandedValue,
required this.headerValue,
this.isExpanded = false,
);
String expandedValue;
String headerValue;
bool isExpanded;
List<Item> generateItems(int numberOfItems)
return List<Item>.generate(numberOfItems, (int index)
return Item(
headerValue: 'Panel $index',
expandedValue: 'This is item number $index',
);
);
class MyStatefulWidget extends StatefulWidget
const MyStatefulWidget(Key? key) : super(key: key);
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
class _MyStatefulWidgetState extends State<MyStatefulWidget>
final List<Item> _data = generateItems(8);
@override
Widget build(BuildContext context)
return SingleChildScrollView(
child: Container(
child: _buildPanel(),
),
);
Widget _buildPanel()
return ExpansionPanelList(
expansionCallback: (int index, bool isExpanded)
setState(()
_data[index].isExpanded = !isExpanded;
);
,
children: _data.map<ExpansionPanel>((Item item)
return ExpansionPanel(
headerBuilder: (BuildContext context, bool isExpanded)
return ListTile(
title: Text(item.headerValue),
);
,
body: ListTile(
title: Text(item.expandedValue),
subtitle:
const Text('To delete this panel, tap the trash can icon'),
trailing: const Icon(Icons.delete),
onTap: ()
setState(()
_data.removeWhere((Item currentItem) => item == currentItem);
);
),
isExpanded: item.isExpanded,
);
).toList(),
);
你会有一些想法
谢谢
【讨论】:
【参考方案2】:好的,您可以使用 ExpandablePanel 小部件实现您的目标。我用过这个package。我试过这样的事情。这些 buildCollapsed()、buildExpanded()、expandColumn() 是根据您的需要定制的函数。
ExpandablePanel(
theme: const ExpandableThemeData(
headerAlignment:
ExpandablePanelHeaderAlignment.center,
//tapBodyToExpand: true,
//tapBodyToCollapse: true,
hasIcon: false,
),
header: Expandable(
collapsed: buildCollapsed(), // widget header when the widget is Collapsed
expanded: buildExpanded(), // header when the widget is Expanded
),
collapsed: Container(), // body when the widget is Collapsed, I didnt need anything here.
expanded: expandedColumn() // body when the widget is Expanded
) '
为了更好地理解,请阅读包装文档,如果您有任何问题,请告诉我。
【讨论】:
以上是关于Flutter Dart 中的 SizedBox 或 Container的主要内容,如果未能解决你的问题,请参考以下文章
Flutter ListView.builder sizedbox问题
Flutter:SizedBox Vs Container,为啥使用一个而不是另一个?