一、颜色的使用
color:Color(0xFFF3F5FB), --十六进制颜色,最后6位为十六进制颜色值 color: Color.fromARGB(255, 24, 34, 34)),--RGB颜色值, color: Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5); color: Color.fromARGB(255, 66, 165, 245); color: Color.fromRGBO(66, 165, 245, 1.0);//opacity:不透明度 color:Color.blue
二、container设置
Container( width: 100, height: 100, alignment: Alignment.center, child: Text('有背景图'), decoration: BoxDecoration( color: Colors.red, image: DecorationImage( image: AssetImage('assets/images/dialog_success.png'), fit: BoxFit.fill, // 完全填充 ), ), ), Container( width: 250, height: 200, decoration: BoxDecoration( border: Border( top: BorderSide(width: 15.0, color: Color(0xFFFF7F7F7F)), left: BorderSide(width: 20.0, color: Color(0xFFFFDFDFDF)), right: BorderSide(width: 5.0, color: Color(0xFFFF000000)), bottom: BorderSide(width: 10.0, color: Color(0xFFFF000000)), ), ) ) Container( decoration: BoxDecoration( //设置边框 border: new Border.all(color: Color(0xFFFF0000), width: 0.5), //背景颜色 color: Colors.white, //设置圆角 borderRadius: new BorderRadius.circular((5.0)), borderRadius: BorderRadius.only( topLeft: Radius.circular(10.0), bottomLeft: Radius.circular(10.0) ), //设置阴影 boxShadow: [BoxShadow(color: Colors.lightGreen, offset: Offset(1.0, 1.0), blurRadius: 1.0, spreadRadius: 1.0), ], ), ) Container( decoration: ShapeDecoration( image: new DecorationImage( //设置背景图片 image: AssetImage("assets/images/task_icon.jpg"), fit: BoxFit.cover, ), //设置圆角 shape:RoundedRectangleBorder(borderRadius: BorderRadiusDirectional.circular(20)), ), //设置边距 margin: EdgeInsets.only(top: 16, left: 20, right: 20), child: new Card( color: Colors.transparent, …… )
三、showModalBottomSheet设置
Future<T> showModalBottomSheet<T>({ @required BuildContext context, @required WidgetBuilder builder, Color backgroundColor, double elevation, ShapeBorder shape, Clip clipBehavior, Color barrierColor, bool isScrollControlled = false, bool useRootNavigator = false, bool isDismissible = true, bool enableDrag = true, }) builder:构造内容 backgroundColor:背景颜色指的是显示内容下面的颜色,要设置圆角弹窗,该项使用null,默认是灰白色,根据系统主题 elevation :阴影高度,没看出效果 ShapeBorder: 边线,可以指定单边或者多边,还可以是圆形的,ShapeBorder的子类都可以,还可以设置圆角 clipBehavior :widget剪裁模式,分none、hardEdge、antiAlias、antiAliasWithSaveLayer,效率依次降低,效果依次提高 barrierColor: 蒙版颜色,就是遮住原页面内容的半透明黑色,默认是Colors.black54 isScrollControlled :是否可滚动,用于调整内容部分的高度的模式,后面展开详细 useRootNavigator: 一般用不上 isDismissible :点击外部区域是否关闭弹窗,默认true enableDrag: 启用拖拽功能,拖动弹窗关闭,默认true showModalBottomSheet( context: context, isScrollControlled:false, backgroundColor: Colors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))), shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( --设置左上角和右上角圆角 topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0) ), ), builder: (BuildContext context) { return Container( child: Center(child: Text("居中文字")), ); }); 若要点击按钮关闭弹窗,在点击事件里面加入Navigator.pop(context)即可
四、TextField详解
TextField( controller: _inputController,//控制器 focusNode: _inputFocusNode,//焦点 style: TextStyle(fontSize: 16, color: Colors.black87),//文字大小、颜色 maxLines: 10,//最多多少行 minLines: 1,//最少多少行 onChanged: (text) {//输入框内容变化回调 setState(() {}); }, decoration: InputDecoration( fillColor: Colors.grey[50],//背景颜色,必须结合filled: true,才有效 filled: true,//重点,必须设置为true,fillColor才有效 isCollapsed: true,//重点,相当于高度包裹的意思,必须设置为true,不然有默认奇妙的最小高度 contentPadding: EdgeInsets.symmetric(horizontal: 8, vertical: 10),//内容内边距,影响高度 border: _outlineInputBorder,//边框,一般下面的几个边框一起设置 //keyboardType: TextInputType.number, //键盘类型 //obscureText: true,//密码模式 focusedBorder: _outlineInputBorder, enabledBorder: _outlineInputBorder, disabledBorder: _outlineInputBorder, focusedErrorBorder: _outlineInputBorder, errorBorder: _outlineInputBorder, ), ), ) /输入框控制器,一般用于获取文本、修改文本等 TextEditingController _inputController = TextEditingController(); //焦点节点,一般用于自动获取焦点,取消焦点以便隐藏键盘等 FocusNode _inputFocusNode = FocusNode(); //边框样式 OutlineInputBorder _outlineInputBorder = OutlineInputBorder( gapPadding: 0, borderSide: BorderSide( color: Colors.grey[200], ), );
五、Expanded详解
只能在Column,Row,Flex以及它们的子组件,这里指的是子组件而不是子结点,是指继承Column,Row,Flex的子组件。 Expanded的父结点必须是Column,Row,Flex以及它们的子组件,不能是Column->Container->Expanded(表示结点路径) 在使用Expanded时,如果在它的上层结点中有List类型的结点,比如SingleChildScrollView,或者ListTile等,其滑动方向应该与Expanded填充方向不同,不然会报错。 Expanded作用是,填充剩余空间。 class Expanded extends Flexible { /// Creates a widget that expands a child of a [Row], [Column], or [Flex] /// so that the child fills the available space along the flex widget's /// main axis. const Expanded({ Key? key, int flex = 1, required Widget child, }) : super(key: key, flex: flex, fit: FlexFit.tight, child: child); } flex:表示弹性系数,弹性系数越高,所占空间越大,类似于Android原生的LinearLayout的weight属性。 child:子节点 示例 flutter代码 Scaffold( appBar: AppBar( // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), body: Column( children: [ Expanded( flex: 1, child: Container( color: Colors.black, )), Expanded( flex: 2, child: Container( color: Colors.red, )), Expanded( flex: 1, child: Container( color: Colors.blue, )) ], ), // This trailing comma makes auto-formatting nicer for build methods. ); Row 和 Column 是 Flex 组件,是无法滚动的,如果没有足够的空间,flutter就提示溢出错误。 这种情况下,Expanded 或 Flexible 组件可用作长文本的自动换行。 第一个元素再换成 Expanded ,这样剩余的空间就会被第一个元素填充: Column( children: <Widget>[ Row( children: <Widget>[ Expanded(child: Text('AAAA')), Text('ZZZZ')], ), ], ), 这样,当第一个元素是一个长文本,并且两个元素内容长于可用范围时,第一个元素会自动换行: Column( children: <Widget>[ Row( children: <Widget>[ Expanded(child: Text(String.fromCharCodes(List.generate(100, (i) => 65)))), Text('ZZZZ')], ), ], ),