gpt4 book ai didi

flutter:ListTile 如何适应前导边距和标题/副标题样式?

转载 作者:IT王子 更新时间:2023-10-29 06:48:27 25 4
gpt4 key购买 nike

我正在构建一个由各种小部件组成的表单,我想将它们全部对齐。

在以下示例中,我使用了 TextFormField、ListTile 等。

问题与 TextFormField > decoration > icon 和 ListTile > leading 的对齐有关。

如您所见,ListTile > leading 绝对不与 TextFormField > decoration > 图标对齐。

在文档中,我找不到任何关于如何调整 ListTile > leading "margin left"的解释

子问题:如何设置 ListTile 标题和副标题的样式,使其看起来像 TextFormField?

我们非常欢迎任何帮助。

源代码摘录:

_buildBody() {
return new SafeArea(
top: false,
bottom: false,
child: new Form(
key: _formKey,
autovalidate: false,
child: new SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
/* -- Profile Picture -- */
const SizedBox(height: 24.0),
_buildProfilePicture(),

/* -- Alias -- */
new TextFormField(
decoration: const InputDecoration(
border: const UnderlineInputBorder(),
filled: true,
icon: const Icon(Icons.person),
hintText: 'Enter an alias',
labelText: 'Alias *',
),
onSaved: (String value) {
profile.alias = value;
},
validator: _validateAlias,
),
const SizedBox(height: 24.0),

/* -- Gender -- */
_buildGender(context),
const SizedBox(height: 24.0),

/* -- Self description -- */
new TextFormField(
decoration: const InputDecoration(
border: const OutlineInputBorder(),
hintText: 'Tell us about yourself',
labelText: 'Describe yourself',
),
maxLines: 5,
),
const SizedBox(height: 24.0),

/* -- Save Button -- */
new Center(
child: new RaisedButton(
child: const Text('Save'),
onPressed: _handleSave,
),
),
const SizedBox(height: 24.0),
],
),
),
),
);
}

_buildGender(BuildContext context) {
return new GestureDetector(
child: new ListTile(
leading: new Container(width: 24.0, height: 24.0, color: Colors.red),//const Icon(Icons.casino),
title: const Text('Gender'),
subtitle: new Text(profile.gender),
trailing: const Icon(Icons.arrow_drop_down),
dense: true,
),
onTap: () async {
await showModalBottomSheet<void>(
context: context,
builder: (BuildContext context){
return _buildGenderBottomPicker();
},
);
}
);
}

快照:(我已经标记错位) enter image description here

最佳答案

由于我找不到任何适合 ListTile 的直接解决方案,并且没有办法通过负边距来更正 ListTile 设置的默认边距(请参阅其源代码),我决定构建自己的一个(简化版):

这是我的解决方案:

_buildGender(BuildContext context) {
List<Widget> children = <Widget>[];
/* -- leading -- */
children.add(new Container(
width: 40.0,
alignment: AlignmentDirectional.centerStart,
child: const Icon(Icons.album, color: Colors.grey),
));

/* -- title & subtitle -- */
children.add(new Expanded(
child: new Container(
height: 48.0,
padding: const EdgeInsets.fromLTRB(10.0, 5.0, 10.0, 5.0),
decoration: new BoxDecoration(
color: Color.fromRGBO(0, 0, 0, 0.05),
border: new Border(bottom: new BorderSide(color: Colors.black)),
),
child: new Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text('Gender',
style: new TextStyle(color: Colors.blue, fontSize: 12.0)),
const SizedBox(height: 5.0),
new Text(profile.gender),
],
),
),
));

/* -- trailing -- **/
children.add(new Container(
width: 40.0,
height: 48.0,
alignment: AlignmentDirectional.centerEnd,
decoration: new BoxDecoration(
color: Color.fromRGBO(0, 0, 0, 0.05),
border: new Border(bottom: new BorderSide(color: Colors.black)),
),
child: const Icon(Icons.arrow_drop_down),
));

return new InkWell(
child: new Semantics(
child: new ConstrainedBox(
constraints: new BoxConstraints(minHeight: 60.0),
child: new UnconstrainedBox(
constrainedAxis: Axis.horizontal,
child: new SafeArea(
top: false,
bottom: false,
child: new Row(children: children),
),
),
),
),
onTap: () async {
await showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return _buildGenderBottomPicker();
},
);
});

以及我获得的布局:

enter image description here

当然还有一些工作要做,以改进代码、使用主题并最终使其成为一个 Widget,但这只是一个开始。

我只是想与您分享这段代码。

关于flutter:ListTile 如何适应前导边距和标题/副标题样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50012152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com