开篇寄语
伯衡君发现总结了有关flutter编程语言以制作全平台的App,通过前一篇梳理Widgets组件内容,感到思路清晰了不少,这一篇文章继续进行梳理,有关Layouts的内容,这个相当于Web中的<div></div>的样子,也是一个个框架结构,又细分不少内容,伯衡君希望进行梳理后,有一个整体的认知,让我们开始吧。
前情提要
- 《Flutter2发布,一套代码适用全系统应用开发以及Web应用》
- 《如何在Mac M1芯片电脑上安装Flutter并建立自己第一个全系统应用》
- 《如何在Windows电脑上安装Flutter并建立自己第一个全系统应用》
- 《Flutter制作自己的第一个全平台APP学习之Widgets篇》
内容详情
以下内容大多是更改lib下的main.dart文件内容,删掉里面的内容,复制粘贴代码,开启调试就可以出现了。
官网开发文档中给出了各个布局使用的名称以及所属关系,咱们就按照这个先后顺序进行了解即可。
Container
- Container在前文中想必在程式代码中已经了解,简单来说它正如字面意思是一个容器,在这个容器中可以进行布局,或者放入更多的容器,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Container( width: 200.0, height: 200.0, color: Colors.blue, child: Padding( padding: const EdgeInsets.all(16.0), child: Container( decoration: BoxDecoration( border: Border.all(width: 5.0), color: Colors.yellow, borderRadius: BorderRadius.circular(20.0)), padding: const EdgeInsets.fromLTRB(10.0, 20.0, 30.0, 40.0), child: Container( color: Colors.red, padding: const EdgeInsets.symmetric( vertical: 10.0, horizontal: 20.0), transform: Matrix4.rotationZ(-0.1), child: Container( decoration: const BoxDecoration( color: Colors.green, borderRadius: BorderRadius.horizontal( left: Radius.circular(10.0), right: Radius.circular(30.0), ), ), alignment: Alignment.topLeft, child: const Text("hello"), ), ), ), ), ), ), ), ); } }
生成的效果如下图所示:
看起来是不是很像套娃?
Row, Column
- Row正如字面之意,是指的横向排列
- Column也正如字面之意,是指的横向排列
Row框架代码如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Row(children: <Widget>[ Text("12345 "), Text("678910 "), Text("1112131415 "), Text("1112131415 "), ]), ), ); } }
生成效果如下图所示:
Column框架代码如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Column(children: <Widget>[ Text("12345"), Text("678910"), Text("1112131415"), Text("1112131415"), ]), ), ); } }
生成效果如下图所示:
Wrap
- 这个可以理解成智能的Row和Column,当横向排列的元素足够多的时候此前可能不在屏幕显示,也就是跳脱出画面,如果使用Wrap则会智能的平均分配另起一行,不至于导致元素冲出画面,代码如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Wrap( // Gap between adjacent chips. direction: Axis.vertical, spacing: 8.0, // Gap between lines. runSpacing: 4.0, children: [ 'Cauchy', 'Fourrier', 'Lagrange', 'Lebesgue', 'Levy', 'Poisson', 'Pointcare', ] .map((String name) => Chip( avatar: CircleAvatar(child: Text(name.substring(0, 1))), label: Text(name), )) .toList(), )), )); } }
生成效果如下图所示:
FractionallySizedBox
- 简单来说就是能够精确控制子部件的空间位置,这个无需做过多演示
Expanded
- 扩展 Row、Column 或 Flex 的子级以便子级填充可用空间的小部件,换句话说呢,就是在框架里面,填充又一种框架,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Row( children: <Widget>[ Container( child: Center( child: Text( 'First widget', style: TextStyle( color: Colors.white, ), ), ), color: Colors.blue, height: 200, width: 100, ), Expanded( child: Container( child: Center( child: Text( 'Second widget', style: TextStyle( color: Colors.white, ), ), ), color: Colors.amber, height: 200, ), ), Container( child: Center( child: Text( 'Third widget', style: TextStyle( color: Colors.white, ), ), ), color: Colors.pink, height: 200, width: 100, ), ], )), )); } }
生成的效果如下图所示:
Stack
- Stack 小部件允许我们在屏幕上放置多层小部件,试举例如下:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root // of your application @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Insert Image Demo'), ), body: Center( child: Stack( children: <Widget>[ // Max Size Container( color: Colors.green, ), Container( color: Colors.blue, height: 300.0, width: 300.0, ), Container( color: Colors.pink, height: 150.0, width: 150.0, ) ], )), )); } }
生成的效果如下图所示:
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号