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
监听键盘事件。