Flutter常用的组件
应用程序组件
MaterialApp
它是应用程序的入口。
API
- { ThemeData } theme: 默认视觉属性,例如颜色字体和形状。
- initialRoute: 初始化路由。
- onGenerateRoute: 路由生成器。建议路由使用beamer。
import 'package:flutter/material.dart'; import 'package:beamer/beamer.dart'; class Routes { static String home = '/'; static final routerDelegate = BeamerDelegate( locationBuilder: SimpleLocationBuilder( routes: { home: (BuildContext context, BeamState state) => Home() } ) ); } class MaterialAppExample extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( theme: ThemeData(primaryColor: Colors.white), // 修改主体颜色 routeInformationParser: BeamerParser(), routerDelegate: Routes.routerDelegate ); } }
Scaffold
基本的视觉布局结构。此类提供用于显示抽屉和底部工作表的API。
API
- { AppBar } appBar: 顶部
- body
import 'package:flutter/material.dart'; class Scaffold extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, // 去除阴影 backgroundColor: Colors.white, // 修改主体颜色 shape: Border(bottom: BorderSide(color: Color(0x000000), width: 1)), // 下边框 title: Text('标题', style: TextStyle(color: Colors.black)), actions: <Widget>[SendButton(buttonText: '按钮')], leading: IconButton( icon: Icon(Icons.arrow_back_ios, color: Colors.black), onPressed: () {} ) ), body: Component() ); } }
AppBar
应用栏目。
API
- elevation: 阴影。
- backgroundColor: 背景颜色。
- shape: 下边框。
- title: 导航标题。
- actions: 右侧小组件。
- leading: 左侧导航配置。
盒模型布局组件
Container
一个方便的小部件,结合了常见的绘画、定位和大小调整小部件。
API
- width: 宽
- height: 高
- padding
- { BoxDecoration } decoration
import 'package:flutter/material.dart'; class ContainerExample extends StatelessWidget { @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( border: Border( bottom: BorderSide( width: 1.0, color: Color.fromRGBO(238, 238, 238, 1) ) ) ), padding: EdgeInsets.only(top: 12.0, bottom: 12.0), child: Component() ); } }
Column
在垂直阵列中显示其子项的小部件。
Row
在水平阵列中显示其子项的小部件。
Expanded
扩展 Row、Column 或 Flex 的子级以便子级填充可用空间的小部件。
GridView
网格组件。
import 'package:flutter/material.dart'; class GridViewExample extends StatelessWidget { @override Widget build(BuildContext context) { return GridView( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, //横轴三个子widget childAspectRatio: 1.0 //宽高比为1时,子widget ), children:<Widget>[ Icon(Icons.ac_unit), Icon(Icons.airport_shuttle), Icon(Icons.all_inclusive), Icon(Icons.beach_access), Icon(Icons.cake), Icon(Icons.free_breakfast) ] ); } }
API
- { bool } shrinkWrap: 该属性表示是否根据子组件的总长度来设置ListView的长度,默认值为false 。 默认情况下,ListView的会在滚动方向尽可能多的占用空间。 当ListView在一个无边界(滚动方向上)的容器中时,shrinkWrap必须为true。
- physics: NeverScrollableScrollPhysics()。禁止滑动。
- controller: ScrollController(keepScrollOffset: false)。禁止回弹效果。
ListView
列表组件,可以允许滚动。
Stack
重叠布局,允许子组件堆叠。
Positioned
配合Stack实现绝对定位。
SizedBox
一般用来限制子控件的大小。
样式组件
Center
将其子项置于自身中心的小部件。
Align
对齐组件。
Padding
内边距组件。
import 'package:flutter/material.dart'; class PaddingExample extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( padding: EdgeInsets.only(top: 5.0, right: 10.0, bottom: 5.0, left: 10.0), child: Text('Padding') ); } }
ClipRRect
圆角形状。
import 'package:flutter/material.dart'; class ClipRRectExample extends StatelessWidget { @override Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(5.0), child: Component() ); } }
功能组件
ElevatedButton
按钮组件。
import 'package:flutter/material.dart'; class ElevatedButtonExample extends StatelessWidget { @override Widget build(BuildContext context) { return ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Color.fromRGBO(245, 67, 67, 1)), // 颜色 shape: MaterialStateProperty.all( // 带有圆角的矩形边框 RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)) ), side: MaterialStateProperty.all(BorderSide(color: Colors.purple, width: 3)) ), child: Padding( child: Text('按钮') ), onPressed: () {} ); } }
ElevatedButton.icon
带图标的按钮组件。
import 'package:flutter/material.dart'; class ElevatedButtonIconExample extends StatelessWidget { @override Widget build(BuildContext context) { return ElevatedButton.icon( icon: Icon(Icons.g_mobiledata), label: Text('按钮'), onPressed: () {}, ); } }
IconButton
图标按钮。
TextField
表单input输入组件。
import 'package:flutter/material.dart'; final TextEditingController controller = TextEditingController(); final FocusNode focusNode = FocusNode(); class TextFieldExample extends StatelessWidget { @override Widget build(BuildContext context) { return TextField( controller: controller, focusNode: focusNode, autofocus: true, minLines: 5, maxLines: 10, keyboardType: TextInputType.multiline, textInputAction: TextInputAction.newline, decoration: InputDecoration.collapsed(hintText: '请输入文字'), onChanged: (String value) {} ); } }
Image
图片展示组件。
AssetImage
响应式加载图片。
Image img = Image(image: AssetImage('statics/images/1.png'));
NetworkImage
加载网络图片。
Image img = Image( image: NetworkImage('https://example.com/1.png'), fit: BoxFit.cover // 设置图片的背景展示 );
Image.file
加载本地图片。
Image image = Image.file(File(imagePath));
Image.memory
根据Uint8List渲染图片。
Uint8List img = getImage(); Image image = Image.memory(img, fit: BoxFit.cover);
工具组件
GestureDetector
手势检测的部件。
import 'package:flutter/material.dart'; /// 取消input的焦点 class GestureDetectorExample extends StatelessWidget { @override Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { // 触摸收起键盘 FocusScope.of(context).requestFocus(FocusNode()); }, child: Text('') ); } }
showDialog
展示弹出框。
import 'package:flutter/material.dart'; /// 弹出框 /// @param { BuildContext } context /// @param { String } message: 文本 void alert(BuildContext context, String message) { showDialog( context: context, barrierColor: Color.fromRGBO(0, 0, 0, 0), builder: (c) { return AlertDialog( backgroundColor: Color.fromRGBO(33, 34, 35, 0.9), elevation: 0, content: Text( message, style: TextStyle(color: Colors.white), textAlign: TextAlign.center ) ); } ); }
InheritedWidget
状态管理。
class InheritedWidgetProvider extends StatefulWidget { @override _InheritedWidgetProvider createState() => _InheritedWidgetProvider(); } class _InheritedWidgetProvider extends State<InheritedWidgetProvider> { String value = ''; @override Widget build(BuildContext context) { return InheritedWidgetExample(value: value); } } class InheritedWidgetExample extends InheritedWidget { String value; InheritedWidgetExample({ Key? key, required Widget child, required String this.value }): super(key: key, child: child); static InheritedWidgetExample of(BuildContext context) { final FormValueContext? ctx = context.dependOnInheritedWidgetOfExactType<FormValueContext>(); return ctx!; } @override bool updateShouldNotify(FormValueContext oldWidget) { return oldWidget.value != value; } }
Notification
跨组件通信。网站参考:https://zhuanlan.zhihu.com/p/110120429。
RawKeyboardListener
监听键盘事件。