1、
2、
RenderObjectWidget:它主要提供了一些如何去约束它里面的布局的一些配置。
它有两个比较重要的实现,一个是SingleChildRenderObjectWidget,另一个是MultiChildRenderObjectWidget.
SingleChildRenderObjectWidget:单节点的一个组件
Opacity [əʊˈpæsəti] :用来改变透明度的一个组件
ClipOval:将布局裁剪成圆形的一个组件
ClipRRect:裁剪成方形的一个组件
PhysicalModel:将布局显示成不同的形状的一个组件
Align:(如Center,将布局进行居中)
Padding:设置布局内边距
SizedBox:用来约束布局的大小
FractionallySizedBox:可以约束里面的布局垂直方向或者水平方向的伸展,也就是说它可以把布局垂直方向或者水平方向充满整个屏幕,它是一个可以约束它里面的组件可以撑多大的一个组件
ClipOval:将布局裁成圆形
ClipRRect:裁成方形 Opacity:设置透明度
PhysicalModel:将布局显示成不同的组件
boderRadius:裁剪布局的四个角,裁剪为圆角
FractionallySizedBox:可以约束里面的布局垂直方向或者水平方向的伸展,也就是说它可以把布局垂直方向或者水平方向充满整个屏幕,它是一个可以约束它里面的组件可以撑多大的一个组件
不添加FractionallySizedBox时,Text只是按它的内容填满了
使用FractionallySizedBox以后:
MultiChildRenderObjectWidget:多节点的一个组件
Stack:相当于Android的FrameLayout,它里面的布局都是一个叠一个,后面的布局会覆盖前面的布局
Flex:有两个重要的实现,Column和Row。Column:y轴。垂直方向上从上到下的一个组件。 Row:x轴。水平方向,从左到右的水平方向的一个组件。
Wrap:和Row组件很像,它们都是从左到右排列的布局。不同之处在于Wrap可以换行。
Flow:Flow组件用起来不是很方便,所以它很少遇到。
Column:纵向排列布局 Row:横向排列布局
Stack:相当于Android的FrameLayout,它里面的布局都是一个叠一个,后面的布局会覆盖前面的布局
Wrap:和Row组件很像,它们都是从左到右排列的布局。不同之处在于Wrap可以换行。
3、
ParentDataWidget:它有两个比较重要的实现,一个是Positioned,一个是Flexible
Positioned:用于固定View的一个位置的一个组件,通常与Stack进行搭配使用
Flexible:它有一个非常重要的实现Expanded,就是在父容器中能够展开多大大小的一个组件
Positioned:用于固定View的一个位置的一个组件,通常与Stack进行搭配使用
第二张图片位于第一张图片的左下方
Flexible:它有一个非常重要的实现Expanded,就是在父容器中能够展开多大大小的一个组件
不使用Expanded之前,只能按内容填充高度
因为Column是纵向的,所以就会在y轴填充满屏幕
4、
import 'package:flutter/material.dart'; import 'package:flutter_color_plugin/flutter_color_plugin.dart'; void main() => runApp(FlutterLayoutPage()); //如何进行Flutter布局开发? class FlutterLayoutPage extends StatefulWidget{ @override State<StatefulWidget> createState() => _FlutterLayoutGroupPage(); } class _FlutterLayoutGroupPage extends State<FlutterLayoutPage>{ int _currentIndex=0; Future<Null> _handleRefresh()async{ await Future.delayed(Duration(milliseconds: 200)); return null; } _item(String title,Color color){ return Container( alignment: Alignment.center, decoration: BoxDecoration(color: color), child: Text(title,style: TextStyle(fontSize: 22,color:Colors.white)), ); } _chip(String label){ return Chip(label: Text(label), avatar: CircleAvatar( backgroundColor: Colors.blue.shade900, child: Text( label.substring(0,1), style: TextStyle(fontSize: 10), ), ) ); } @override Widget build(BuildContext context) { TextStyle textStyle=TextStyle(fontSize: 20); return MaterialApp( title: '如何进行Flutter布局开发?', theme: ThemeData( primarySwatch: Colors.yellow, ), home: Scaffold( appBar: AppBar(title: Text('如何进行Flutter布局开发?')), bottomNavigationBar: BottomNavigationBar( //默认选中第0个 currentIndex: _currentIndex, onTap: (index){ setState(() { //当点击后回调该方法,改变点击的index _currentIndex=index; }); }, items:[ BottomNavigationBarItem( icon: Icon(Icons.home,color: Colors.grey), activeIcon: Icon(Icons.home,color: Colors.blue), title:Text('首页') ), BottomNavigationBarItem( icon: Icon(Icons.list,color: Colors.grey), activeIcon: Icon(Icons.list,color: Colors.blue), title:Text('列表') ) ]), floatingActionButton: FloatingActionButton( onPressed: null, child: Text('点我') ), body: _currentIndex==0? RefreshIndicator( child: ListView( children: <Widget>[ Container( decoration: BoxDecoration(color: Colors.blue), alignment: Alignment.center, child: Column( children: <Widget>[ Row( children: <Widget>[ ClipOval( child: SizedBox( width: 100, height: 100, child: Image.network('http://www.devio.org/img/avatar.png' ), ) ), Padding( padding: EdgeInsets.all(10), child: ClipRRect( borderRadius:BorderRadius.all(Radius.circular(10)),//圆角 child: Opacity(opacity: 0.6, child: Image.network('http://www.devio.org/img/avatar.png', width: 100, height: 100, ) ), ), ), Text("横向 Row"), ], ), //网上加载图片 Image.network('http://www.devio.org/img/avatar.png', width: 100, height: 100,), TextField( //输入文本的样式 decoration: InputDecoration( contentPadding: EdgeInsets.fromLTRB(5, 0, 0, 0), hintText: '请输入', hintStyle: TextStyle(fontSize: 15) ), ), Container( height: 100, margin: EdgeInsets.all(10), // decoration: BoxDecoration(color: Colors.lightBlueAccent), child: PhysicalModel(color: Colors.transparent, borderRadius: BorderRadius.circular(6), clipBehavior: Clip.antiAlias,//抗锯齿 child: PageView( children: <Widget>[ _item("Page1", Colors.deepPurple), _item("Page2", Colors.green), _item("Page3", Colors.red), ], ), ) ), Column( children: <Widget>[ FractionallySizedBox( widthFactor: 1, child: Container( decoration: BoxDecoration(color: Colors.greenAccent), child: Text('宽度撑满'), ) ), ], ), ], ), ), Stack( children: <Widget>[ Image.network('http://www.devio.org/img/avatar.png', width: 100, height: 100, ), Positioned( left: 0, bottom: 0, child: Image.network('http://www.devio.org/img/avatar.png', width: 36, height: 36, ), ) ], ), Wrap( //创建一个wrap布局,从左向右进行排列,会自动换行 spacing: 8,//水平间距 runSpacing: 6,//垂直间距 children: <Widget>[ _chip("Flutter"), _chip("进阶"), _chip("实战"), _chip("携程"), _chip("App"), ], ) ] ), onRefresh: _handleRefresh) :Column( children: <Widget>[ Text("列表"), Expanded( child: Container( decoration: BoxDecoration( color: Colors.red ), child: Text('拉伸填满高度'), ) ) ], ) ), ); } } //StateLessWidget与基础组件 class LessGroupPage extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { TextStyle textStyle=TextStyle(fontSize: 20); return MaterialApp( title: 'StatelessWidget与基础组件', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: AppBar(title: Text('StatelessWidget与基础组件')), body: Container( decoration: BoxDecoration(color: Colors.blue), alignment: Alignment.center, child: Column( children: <Widget>[ Text('I am an Text',style: textStyle), Icon(Icons.android,size: 50,color: Colors.red), CloseButton(), BackButton(), Chip( //材料设计中一个非常有趣的小部件 avatar: Icon(Icons.people), label: Text('StatelessWidget与基础组件'), ), Divider( height: 10,//容器高度,不是线的高度 indent: 10,//左侧间距 color: Colors.orange ), Card( color: Colors.red, elevation: 5,//阴影 margin: EdgeInsets.all(10), child: Container( padding: EdgeInsets.all(10), child: Text('I am Card',style: textStyle,), ), ), AlertDialog( title: Text('盘它'), content: Text('你这个糟老头子坏得很'), ) ], ), ), ), ); } }