flutter 文字过长超出范围_flutter AppBar leading内容过长导致宽度不够的问题

我爱模板网在用flutter做app时,需要做下面的效果:

这个左边的icon+文字,肯定要用AppBar的leading写了,再设置个宽度,于是写了下面的代码:

class HomePage extends StatelessWidget {

const HomePage({Key key}) : super(key: key);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

leading: Container(

margin: EdgeInsets.only(left: ScreenUtil().setWidth(30)),

width: ScreenUtil().setWidth(160),

child:Row(

children: [

Image.asset(

'images/icon-addr.png',

width: ScreenUtil().setWidth(28),

height: ScreenUtil().setHeight(28),

),

Text(

'合肥市',

style: TextStyle(fontSize: ScreenUtil().setSp(28)),

maxLines: 1,

overflow: TextOverflow.ellipsis,

)

],

)

),

title: Text(

'云仓网',

style: TextStyle(

fontSize: ScreenUtil().setSp(34),

),

),

centerTitle: true,

),

body: Center(

child: Text('首页'),

),

);

}

}

结果却是下面的效果:

leading里面的Container宽度根本不起作用。

百度了好久没找到解决办法,倒是遇到很多和我一样问题的人,只能去google找找了:

结果我找到了下面的效果:

这个左边两个图标,这肯定超出了leading的范围了,查看了代码:

return Scaffold(

key: _scaffoldKey,

appBar: AppBar(

titleSpacing: 0.0,

title: Row(

mainAxisAlignment: MainAxisAlignment.start,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

IconButton(

icon: Icon(Icons.menu),

onPressed: () => _scaffoldKey.currentState.openDrawer(),

),

Stack(

alignment: Alignment.center,

children: [

IconButton(

icon: Icon(Icons.mail_outline),

onPressed: _onClickNotification,

),

Positioned(

top: 12.0,

right: 10.0,

width: 10.0,

height: 10.0,

child: Container(

decoration: BoxDecoration(

shape: BoxShape.circle,

color: AppColors.notification,

),

),

)

],

),

Expanded(

child: Center(child: Text('test')),

)

],

),

automaticallyImplyLeading: false,

centerTitle: true,

actions: [

Row(

children: [

Text('Online'),

Switch(

value: true,

onChanged: (bool value) {},

)

],

)

],

),

drawer: Drawer(

child: _buildDrawer(),

),

body: Container(

color: Colors.orange,

),

);

原来根本没有用leading来做,而是用了title,经过改造,终于实现了(标题不太居中,稍微调整即可):

最终代码:

class HomePage extends StatelessWidget {

const HomePage({Key key}) : super(key: key);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Row(

mainAxisAlignment: MainAxisAlignment.start,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

Row(

children: [

Image.asset(

'images/icon-addr.png',

width: ScreenUtil().setWidth(28),

height: ScreenUtil().setHeight(28),

),

Text(

'合肥市',

style: TextStyle(fontSize: ScreenUtil().setSp(28)),

maxLines: 1,

overflow: TextOverflow.ellipsis,

)

],

),

Expanded(

child: Center(

child: Text('云仓网',style: TextStyle(fontSize: ScreenUtil().setSp(34),),)

),

)

],

),

centerTitle: true,

),

body: Center(

child: Text('首页'),

),

);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我来为你详细解答。 首先,你可以使用Flutter中的Scaffold组件来实现这个页面的布局。Scaffold组件是一个脚手架组件,它提供了一个标准的页面布局,包括AppBar、Drawer、BottomNavigationBar等,非常适合快速搭建一个标准的页面。 在AppBar上左侧为返回按钮,标题居中的情况下,你可以这样实现: ```dart Scaffold( appBar: AppBar( leading: IconButton( icon: Icon(Icons.arrow_back), onPressed: () { // 返回上一页 }, ), title: Text('标题'), centerTitle: true, ), body: // 页面内容 ); ``` 在页面内容中,你需要实现三个可点击的组件,组件样式为容器里面上下布局,上面图片下面文字,但是图片超出容器一部分,容器背景色灰色,选中之后变为蓝色。 你可以使用GestureDetector来实现可点击的效果,使用Container来实现容器的样式。具体代码实现如下: ```dart Container( decoration: BoxDecoration( color: Colors.grey[200], borderRadius: BorderRadius.circular(10), ), child: GestureDetector( onTap: () { // 点击事件处理 }, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ClipRRect( borderRadius: BorderRadius.circular(10), child: Image.network( 'https://example.com/image.png', width: 80, height: 80, fit: BoxFit.cover, ), ), SizedBox( height: 10, ), Text( '文字', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ], ), ), ); ``` 这样就可以实现你想要的效果了,当然你可以根据实际需求进行细节调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值