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

时间:2017-11-04 03:17:23

标签: 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'添加到文本对象时,我认为我已经解决了这个问题。没有红线,但文字仍然保持对齐。

2 个答案:

答案 0 :(得分:8)

我不确定您尝试了什么,但是为了使title的{​​{1}}居中,您可以使用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

enter image description here

答案 1 :(得分:0)

这是我的三行拼贴示例:

   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;
              });
            });
          }
        });
      },
    );