从0开始写一个基于Flutter的开源中国客户端(4)

);
}
}

如果将aspectRatio设置为1.0,则Container显示为正方形。(注意,Dart中/代表除法运算,不是取整运算,使用~/做取整运算)

ConstrainedBox组件

ConstrainedBox组件用于给它的子组件强制加上一些约束,比如下面的代码:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new ConstrainedBox(
constraints: const BoxConstraints.expand(width: 50.0, height: 50.0),
child: new Container(
color: Colors.red,
width: 200.0,
height: 200.0,
)
)
),
);
}
}

在上面的代码中,我们给Container设置了长宽都为200,但是Container被ConstrainedBox组件包裹了,而且ConstrainedBox设置了约束constraints: const BoxConstraints.expand(width: 50.0, height: 50.0),由于ConstrainedBox的约束是强制性的,所以最后Container显示出的大小是50而不是200,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IntrinsicWidth & IntrinsicHeight

这两个组件的作用是将他们的子组件调整到组件本身的宽度/高度。

这个类是非常有用的,例如,当宽度/高度没有任何限制时,你会希望子组件按更合理的宽度/高度显示而不是无限的扩展。

LimitedBox组件

LimitedBox是一个当其自身不受约束时才限制其大小的容器。

如果这个组件的最大宽度是没有约束,那么它的宽度就限制在maxWidth。类似地,如果这个组件的最大高度没有约束,那么它的高度就限制在maxHeight

Offstage组件

Offstage组件用于显示或隐藏它的子组件,如下代码所示:

new Offstage(
offstage: false, // true: 隐藏, false: 显示
child: new Text(“hello world”),
)

OverflowBox & SizedOverflowBox

OverflowBox组件它给它的子组件带来不同的约束,而不是从它的父组件中得到,可能允许子组件溢出到父组件中。

SizedOverflowBox组件是一个指定大小的组件,它的约束会传递给子组件,子组件可能溢出。

SizedBox组件

SizedBox是一个指定了大小的容器。

如果指定了SizedBox的大小,则子组件会使用SizedBox的大小,如果没有指定SizedBox的大小,则SizedBox会使用子组件的大小。如果SizedBox没有子组件,SizedBox会按它自己的大小来显示,将nulls当作0。

new SizedBox(
// 如果指定width和height,则Container按照指定的大小显示,而不是Container自己的大小,如果没有指定width和height,则SizedBox按照Container的大小显示
width: 50.0,
height: 50.0,
child: new Container(
color: Colors.red,
width: 300.0,
height: 300.0,
),
)

Transform组件

Transform用于在绘制子组件前对子组件进行某些变换操作,比如平移、旋转、缩放等。

示例代码如下:

new Container(
color: Colors.black,
child: new Transform(
alignment: Alignment.topRight,
// 需要导包:import ‘dart:math’ as math;
transform: new Matrix4.skewY(0.3)…rotateZ(-math.pi / 12.0),
child: new Container(
padding: const EdgeInsets.all(8.0),
color: const Color(0xFFE8581C),
child: const Text(‘Apartment for rent!’),
),
),
)

运行效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

包含多个子Widget的布局容器

Row组件

Row组件字面理解就是代表一行,在一行中可以放入多个子组件。

下面是示例代码:

import ‘package:flutter/material.dart’;

main() {
runApp(new MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
new Text(“hello”),
new Container(
width: 50.0,
height: 50.0,
color: Colors.red,
),
new Text(“world”)
],
)
),
);
}
}

在模拟器上运行的效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Row组件的构造方法中,children参数是一个数组,表示可以有多个子组件,mainAxisAlignment表示Row中的子组件在主轴(Row组件主轴表示水平方向,交叉轴表示垂直方向,Column组件主轴表示垂直方向,交叉轴表示水平方向)上的对齐方式,可以有如下几个取值:

  • MainAxisAlignment.start
  • MainAxisAlignment.center
  • MainAxisAlignment.end
  • MainAxisAlignment.spaceBetween
  • MainAxisAlignment.spaceAround
  • MainAxisAlignment.spaceEvenly

关于上面几个取值,用如下几个图来说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Column组件

Column组件表示一列,可以在一列中放入多个组件,如下代码所示:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Column(
children: [
new Text(“hello”),
new Text(“world”),
new Text(“nihao~”)
],
)
),
);
}
}

Column和Row组件一样,可以通过MainAxisAlignment或者CrossAxisAlignment来设置主轴和交叉轴的对齐方式,这里不再赘述。

Stack组件

Stack组件类似于Android中的FrameLayout,其中的子组件是一层层堆起来的,并不像Row或者Column中的子组件,按水平或垂直方向排列,下面用代码说明:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Stack(
children: [
new Container(
width: 100.0,
height: 100.0,
color: Colors.red,
),
new Container(
width: 30.0,
height: 30.0,
color: Colors.green,
)
],
)
),
);
}
}

在上面的Stack组件中,放入了两个Container,其中第一个Container是100x100大小,第二个Container是30x30大小,在模拟器上运行效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IndexedStack组件

IndexedStack用于根据索引来显示子组件,index为0则显示第一个子组件,index为1则显示第二个子组件,以此类推,下面用代码说明:

new IndexedStack(
index: 1,
children: [
new Container(
width: 100.0,
height: 100.0,
color: Colors.red,
child: new Center(
child: new Text(“index: 0”, style: new TextStyle(fontSize: 20.0),),
),
),
new Container(
width: 100.0,
height: 100.0,
color: Colors.green,
child: new Center(
child: new Text(“index: 1”, style: new TextStyle(fontSize: 20.0),),
),
)
],
)

IndexedStack的构造方法中有个index属性,上面的index属性为1,则显示的是children数组中的第2个元素(绿色方块),如果index改为0,则显示的是第1个元素(红色方块),如果index的大小超过了children数组的长度,则会报错。

Table组件

Table组件用于显示多行多列的布局,如果只有一行或者一列,使用Row或者Column更高效。下面用一段代码展示Table的用法:

class MyApp extends StatelessWidget {

// 生成Table中的数据
List getData() {
var data = [
“hello”,
“world”
];
List result = new List();
TextStyle style = new TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold);
for (int i = 0; i < data.length; i++) {
String str = data[i];
List row = new List();
for (int j = 0; j < str.length; j++) {
row.add(new Text(" ${str[j]} ", style: style));
}
result.add(new TableRow(
children: row
));
}
return result;
}

@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Table(
children: getData()
)
),
);
}
}

在模拟器中运行上面的代码效果如下图:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后如何才能让我们在面试中对答如流呢?

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:

这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,在这里免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。需要的小伙伴们可以点击我的GitHub获取免费领取方式

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以去我的主页加一下技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!

享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。需要的小伙伴们可以点击我的GitHub获取免费领取方式

[外链图片转存中…(img-eO4psXEa-1710684005406)]

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以去我的主页加一下技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

最后,祝愿即将跳槽和已经开始求职的大家都能找到一份好的工作!

这些只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢再关注一下~

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值