繁体   English   中英

如何在Flutter中将ListTile的标题居中

[英]How to center the Title of a ListTile in Flutter

今天我一直在尝试将Flutter ListTile的标题集中在一起。 在过去的几天里,我花了一两个小时的谷歌搜索和尝试的东西,然后失去了我的冷静和放弃。

我只是学习Flutter并喜欢这个概念,但却找不到视频培训课程(Lynda.com,uDemy.com等)。 我已阅读相关文档,但无法摆脱我尝试将其应用于我的代码时出现的所有红线。

语法中必须有逻辑,但在2周之后我还没有完成它。

回到问题,我试过了

List<Widget> list = <Widget>[
  new ListTile(
    new child: Center (
      title:
          new Text('Title 1',
            style: new TextStyle(
                fontWeight: FontWeight.w500,
                color: Colors.deepOrangeAccent,
                fontSize: 25.0)),
    )
  ),
];


List<Widget> list = <Widget>[
  new ListTile(
    title:
            new child: Center (
          new Text('Title 2',
            style: new TextStyle(
                fontWeight: FontWeight.w500,
                color: Colors.deepOrangeAccent,
                fontSize: 25.0)),
    )
  ),
];


List<Widget> list = <Widget>[
  new ListTile(
    child: Center 
            title: (
                new Text('Title 3',
                    style: new TextStyle(
                            fontWeight: FontWeight.w500,
                            color: Colors.deepOrangeAccent,
                fontSize: 25.0)),
    )
  ),
];


List<Widget> list = <Widget>[
  new ListTile(
        title: Center
                new Text('Title 4',
                    style: new TextStyle(
                            fontWeight: FontWeight.w500,
                            color: Colors.deepOrangeAccent,
                            fontSize: 25.0)),
    )
  ),
];

请帮助我解决这个问题,以及在哪里找到Flutter的视频课程?

从好的方面来说,如果这种情况继续下去,我将不再是灰色的,而是会变得秃顶。

当我将'textAlign:TextAlign.center'添加到文本对象时,我以为我已经解决了这个问题。 没有红线,但文字仍然保持对齐。

我不确定您尝试了什么,但是为了使ListTiletitle ListTile您可以像在代码中一样使用center窗口小部件,或者将文本包装在Row窗口小部件中并设置mainAxisAlignment: MainAxisAlignment.center

使用Center小部件:

@override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text("ListTile Example"),),
      body: new ListView(
        children: new List.generate(7, (int index) {
          return new ListTile(
            title: new Center(child: new Text("Centered Title#$index",
              style: new TextStyle(
                  fontWeight: FontWeight.w500, fontSize: 25.0),)),
            subtitle: new Text("My title is centered"),
          );
        }),
      ),
    );
  }

使用Row小部件:

 @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text("ListTile Example"),),
      body: new ListView(
        children: new List.generate(7, (int index) {
          return new ListTile(
            title: new Row(children: <Widget>[new Text("Centered Title#$index",
              style: new TextStyle(
                  fontWeight: FontWeight.w500, fontSize: 25.0),)
            ], mainAxisAlignment: MainAxisAlignment.center,),
            subtitle: new Text("My title is centered"),
          );
        }),
      ),
    );
  }

但是,你的问题不是关于标题的居中,而是关于你试图在一个小区域内插入太大的Text ,这就是你得到红线的原因,所以一个解决方案就是选择一个更小的fontSize一个更好的解决方案是摆脱ListTile并构建自己的自定义小部件,因为ListTile

单个固定高度的行,通常包含一些文本以及前导或尾随图标。

因此,如果您使用更大的小部件,则不应使用它。

这是如何创建类似于ListTile的自定义窗口小部件的简单示例,但在处理较大的项目时更灵活和可自定义:

@override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(title: new Text("ListTile Example"),),
        body: new ListView(
          children: new List.generate(7, (int index) {
            return new Container(
              padding: const EdgeInsets.symmetric(
                  vertical: 10.0, horizontal: 20.0),
              child: new Column(
                children: <Widget>[
                  new Align (child: new Text("Centered Title $index",
                    style: new TextStyle(fontSize: 40.0),), //so big text
                    alignment: FractionalOffset.topLeft,),
                  new Divider(color: Colors.blue,),
                  new Align (child: new Text("Subtitle $index"),
                    alignment: FractionalOffset.topLeft,),
                  new Divider(color: Colors.blue,),
                  new Align (child: new Text("More stuff $index"),
                    alignment: FractionalOffset.topLeft,),
                  new Row(mainAxisAlignment: MainAxisAlignment.end,
                    children: <Widget>[ //add some actions, icons...etc
                      new FlatButton(onPressed: () {}, child: new Text("EDIT")), 
                      new FlatButton(onPressed: () {},
                          child: new Text("DELETE",
                            style: new TextStyle(color: Colors.redAccent),))
                    ],),
                ],
              ),
            );
          }),
        )
    );
  }

在此输入图像描述

这是我的三排瓷砖示例:

   class ThreeRowTile extends StatelessWidget {
      final Widget title;
      final Widget detail;
      final String utility1;
      final String utility1Help;
      final String utility2Help;
      final String utility2;
      final Icon icon;
      final String cell;
      final String home;
      final String office;
      final String email;
      final VoidCallback cellTapped;
      final VoidCallback cellLongPressed;
      final VoidCallback iconTapped;

      ThreeRowTile({
        this.title,
        this.icon,
        this.detail,
        this.utility1,
        this.utility1Help,
        this.utility2,
        this.utility2Help,
        this.cellTapped,
        this.home,
        this.email,
        this.cell,
        this.office,
        this.cellLongPressed,
        this.iconTapped,
      });

      @override
      Widget build(BuildContext context) {
        List<Widget> buildChildren() {
          List<Widget> builder = [];
          if (cell.isNotEmpty && !cell.toString().contains("--")) {
            builder.add(ListTile(
              leading: const Icon(Icons.phone),
              title: Text(
                'Cell',
                textScaleFactor: globals.textScaleFactor,
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              subtitle: Text(
                cell.toString().length > 0 ? cell : "No Number Found",
                textScaleFactor: globals.textScaleFactor,
              ),
              onTap: cell.toString().contains("--")
                  ? null
                  : () {
                      globals.Utility.makePhoneCall(context, cell);
                    },
            ));
          }

          if (office.isNotEmpty && !office.toString().contains("--")) {
            builder.add(ListTile(
              leading: const Icon(Icons.work),
              title: Text(
                'Office',
                textScaleFactor: globals.textScaleFactor,
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              subtitle: Text(
                office.toString().length > 0 ? office : "No Number Found",
                textScaleFactor: globals.textScaleFactor,
              ),
              onTap: office.toString().contains("--")
                  ? null
                  : () {
                      globals.Utility.makePhoneCall(context, office);
                    },
            ));
          }
          if (home.isNotEmpty && !home.toString().contains("--")) {
            builder.add(ListTile(
              leading: const Icon(Icons.home),
              title: Text(
                'Home',
                textScaleFactor: globals.textScaleFactor,
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              subtitle: Text(
                home.toString().length > 0 ? home : "No Number Found",
                textScaleFactor: globals.textScaleFactor,
              ),
              onTap: home.toString().contains("--")
                  ? null
                  : () {
                      globals.Utility.makePhoneCall(context, home);
                    },
            ));
          }
          if (email.isNotEmpty && !email.contains('No Email Address')) {
            builder.add(ListTile(
              leading: const Icon(Icons.email),
              title: Text(
                'Email',
                textScaleFactor: globals.textScaleFactor,
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              subtitle: Text(
                email.toString().length > 0 ? email : "No Email Found",
                textScaleFactor: globals.textScaleFactor,
              ),
              onTap: email.toString().isEmpty
                  ? null
                  : () {
                      globals.Utility.sendEmail(context, email);
                    },
            ));
          }
          if (builder.isEmpty) {
            builder.add(
              ListTile(
                leading: const Icon(Icons.info),
                title: Text(
                  'No Contact Information Found',
                  textScaleFactor: globals.textScaleFactor,
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            );
          }
          return builder;
        }

        String _utility1 =
            utility1 == null || utility1.contains("1-1-1800") ? "" : utility1;
        String _utility2 =
            utility2 == null || utility2.contains("1-1-1800") ? "" : utility2;

        var rowCard = Container(
          decoration: BoxDecoration(
              border: Border(bottom: BorderSide(color: Colors.grey[300]))),
          child: Container(
            padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 5.0),
            child: new Column(
              children: <Widget>[
                Row(
                  children: <Widget>[
                    Align(
                      child: IconButton(
                        icon: icon,
                        onPressed: iconTapped,
                      ),
                      alignment: FractionalOffset.centerLeft,
                    ),
                    Expanded(
                      child: Column(
                        children: <Widget>[
                          new Align(
                            child: title, //so big text
                            alignment: FractionalOffset.topLeft,
                          ),
                          // new Divider(),
                          new Align(
                            child: detail,
                            alignment: FractionalOffset.topLeft,
                          ),
                          // new Divider(),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            mainAxisSize: MainAxisSize.min,
                            children: <Widget>[
                              Expanded(
                                child: Container(
                                  margin: const EdgeInsets.all(3.0),
                                  padding: const EdgeInsets.all(3.0),
                                  decoration: BoxDecoration(
                                      border: Border.all(
                                          color: _utility1.length > 1
                                              ? Colors.grey
                                              : Colors.transparent)),
                                  child: Tooltip(
                                    message:
                                        utility1Help == null ? "" : utility1Help,
                                    child: Text(
                                      _utility1,
                                      maxLines: 1,
                                      textAlign: TextAlign.center,
                                      textScaleFactor: globals.textScaleFactor,
                                    ),
                                  ),
                                ),
                              ),
                              Expanded(
                                child: Container(
                                  margin: const EdgeInsets.all(3.0),
                                  padding: const EdgeInsets.all(3.0),
                                  decoration: BoxDecoration(
                                      border: Border.all(
                                          color: _utility2.length > 1
                                              ? Colors.grey
                                              : Colors.transparent)),
                                  child: Tooltip(
                                    message: utility2 == null ? "" : utility2,
                                    child: Text(
                                      _utility2,
                                      maxLines: 1,
                                      textAlign: TextAlign.center,
                                      textScaleFactor: globals.textScaleFactor,
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Align(
                      child: IconButton(
                        icon: Icon(Icons.arrow_drop_down),
                        onPressed: () {
                          showModalBottomSheet<void>(
                              context: context,
                              builder: (BuildContext context) {
                                return Container(
                                    child: Padding(
                                  padding: EdgeInsets.only(bottom: 10.0),
                                  child: SingleChildScrollView(
                                    child: Column(
                                        mainAxisSize: MainAxisSize.min,
                                        children: buildChildren()),
                                  ),
                                ));
                              });
                        },
                      ),
                      alignment: FractionalOffset.centerRight,
                    ),
                  ],
                ),
              ],
            ),
          ),
          // color: globals.isDarkTheme ? Colors.black45 : Colors.white,
        );

        return (rowCard);
      }
    }

它可以像这样使用:

ThreeRowTile(
      icon: Icon(Icons.person),
      title: _contacts?.items[index]?.lastName.toString().isEmpty &&
              _contacts?.items[index]?.firstName.toString().isEmpty
          ? null
          : Text(
              (_contacts?.items[index]?.lastName ?? "") +
                  ", " +
                  (_contacts?.items[index]?.firstName ?? ""),
              textScaleFactor: globals.textScaleFactor,
            ),
      detail: Text(
        _contacts?.items[index]?.lastActivity,
        textScaleFactor: globals.textScaleFactor,
      ),
      utility1: _contacts?.items[index]?.dateCreated,
      utility1Help: 'Date Created',
      utility2: _contacts?.items[index]?.dateModified,
      utility2Help: "Date Modified",
      cell: _contacts?.items[index]?.cell,
      home: _contacts?.items[index]?.home,
      office: _contacts?.items[index]?.office,
      email: _contacts?.items[index]?.email,
      cellTapped: () {
        globals.contactID = _contacts?.items[index]?.contactID;
        Navigator.of(context).pushNamed("/contact_details").then((value) {
          if (globals.infoChanged) {
            _getData("", false).then((newitems) {
              setState(() {
                _contacts = newitems;
              });
            });
          }
        });
      },
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM