初略讲解Flutter的Switch和Checkbox(基础组件)

2,346 阅读2分钟

单选开关和复选框

Material Widgets库中提供了Material风格的单选开关Switch和复选框Checkbox,它们都是继承自StatefulWidget,但它们的选择状态属于用户数据,所以最好由父Widget来管理其选择状态。当用户点击SwitchCheckbox时,它们会触发onChanged回调,我们可以在此回调中处理选择状态改变逻辑。

示例代码:

// SwitchAndCheckboxApp
class SwitchAndCheckboxApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "单选开关和复选框",
      home: Scaffold(
        appBar: AppBar(
          title: Text("单选开关和复选框"),
        ),
        body: new SwitchAndCheckBoxTestRoute(),
      )
    );
  }
}

// SwitchAndCheckBoxTestRoute
class SwitchAndCheckBoxTestRoute extends StatefulWidget {
  @override
  _SwitchAndCheckBoxTestRouteState createState() => new _SwitchAndCheckBoxTestRouteState();
}

// _SwitchAndCheckBoxTestRouteState
class _SwitchAndCheckBoxTestRouteState extends State<SwitchAndCheckBoxTestRoute> {
  bool _switchSelected = true; //维护单选开关状态
  bool _checkboxSelected = true;//维护复选框状态
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Switch(
          value: _switchSelected,//当前状态
          onChanged:(newValue){
            //重新构建页面  
            setState(() {
              _switchSelected = newValue;
            });
          },
        ),
        Checkbox(
          value: _checkboxSelected,
          activeColor: Colors.red, //选中时的颜色
          onChanged:(newValue){
            setState(() {
              _checkboxSelected = newValue;
            });
          } ,
        )
      ],
    );
  }
}

上面代码中,由于要维护SwitchCheckbox的选择状态,所以SwitchAndCheckBoxTestRoute继承自StatefulWidget,并在其_SwitchAndCheckBoxTestRouteState类中的build方法中分别构建了一个Switch和一个Checkbox,初始化状态都为选中状态,当用户点击时,会将状态置反,然后回调setState()通知framework重新构建UI。

运行效果:

属性

SwitchCheckbox属性比较简单,它们都有一个activeColor属性,用于设置选中状态的颜色,至于大小,到目前为止,Checkbox的大小是固定的,无法自定义,而Switch只能定义宽度,高度也是固定的。值得一提的是,Checkbox有一个属性tristate,表示是否为三态,其默认值为false,这时Checkbox只有两种状态,即“选中”和“未选中”,对应的value值为truefalse;如果设置tristate的值为true,那么Checkbox将会有三种状态,且value的值会增加一个状态null,详细情况读者可自行了解。

总结

通过SwitchCheckbox我们可以看到,虽然它们本身是与状态(是否选中)相关联的,但它们却不是自己来维护状态,而是通过父Widget来管理状态,然后当用户点击时,再通过事件将选择状态通知给父Widget,这样是合理的,因为SwitchCheckbox是否选中本就和用户数据相关联,而这些用户数据也不可能是它们的私有状态,所以我们在自定义Widget时也要思考一下哪种状态的管理方式最为合理。