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