我是 Flutter 的新手,在尝试进行自定义切换时遇到了第一个障碍。我的开关在功能上应该Switch
与材质库中的实际相同,唯一的区别是 UI。
我正在使用ValueNotifier
并ValueListenableBuilder
从另一个小部件更新开关值。这是我的代码的相关部分:
包含小部件
class ParentWidget extends StatefulWidget {
@override
_ParentWidget createState() => _ParentWidget();
}
class _ParentWidgetState extends State<ParentWidget> {
ValueNotifier _switchNotifier = ValueNotifier(false);
@override
Widget build(BuildContext context) {
return Container(
child: ValueListenableBuilder(
valueListenable: _switchNotifier,
builder: (context, switchValue, child) {
return _buildSwitch(switchValue);
},
),
);
}
Widget _buildSwitch(bool switchValue) {
return CustomSwitch(
key: Key(value.toString()),
initValue: switchValue,
onChanged: (value) {
setState(() {
_switchNotifier.value = value;
});
},
);
}
}
改变开关值的小部件
class ChildWidget extends StatefulWidget {
final ValueNotifier _switchNotifier;
ChildWidget(this._switchNotifier);
@override
_ChildWidgetState createState() => _ChildWidgetState();
}
class _ChildWidgetState extends State<ChildWidget> {
@override
Widget build(BuildContext context) {
return Container(
child: GestureDetector(
onTap: () {
widget._switchNotifier.value = false;
},
child: Image(...),
),
);
}
}
自定义开关
class CustomSwitch extends StatefulWidget {
final ValueChanged<bool> onChanged;
final bool initValue;
final Key key;
const CustomSwitch({
@required this.key,
this.onChanged,
this.initValue,
});
@override
_CustomSwitchState createState() => _CustomSwitchState();
}
class _CustomSwitchState extends State<CustomSwitch> {
bool value;
@override
void initState() {
value = widget.initValue;
super.initState();
}
@override
Widget build(BuildContext context) {
// the switch/toggle is animated just like the Material Switch
return TheSwitch(...);
}
_toggle() {
setState(() {
value = !value;
widget.onChanged(value);
});
}
}
如果我_toggle()
从CustomSwitch
开关调用会很好地切换动画(我正在使用AnimatedPositioned
开关)。如果我只依赖用户输入,这很好用,但我还需要以编程方式切换开关,我觉得我错过了一些基本的东西,但我很难过。
我目前的理解是,CustomSwitch
每次我改变它的值时都会重建它,ChildWidget
因为我将开关值用作 a Key
,但是如何用动画很好地做到这一点,就好像我_toggle()
在它被构建后调用一样?
就像在 Java 中一样,您通常会执行类似customSwitch.toggle()
.