Widget 和 CupertinoWidget:避免代码重复
Widget and CupertinoWidget : avoid code duplicate
当我们想要针对 Android 的平台特定 Widget 和针对 iOS 的 Cupertino Widget(如 Switch)时,如何避免代码重复?
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: (Platform.isAndroid)
? Switch(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
: CupertinoSwitch(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
);
}
我经常喜欢用我自己的小部件包装“标准”小部件 - 它允许您在一个地方控制它们。作为附带好处 - 仅在那些 Widget 类.
中进行代码重复
我还看到有可能移出 onChanged 函数并将其两次分配给小部件的 onChanged 字段,如下所示:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: (Platform.isAndroid)
? Switch(
value: activate,
onChanged: _handleChange,
)
: CupertinoSwitch(
value: activate,
onChanged: _handleChange,
)
);
}
void _handleChange() => setState(() { activate = value; });
终于有人给了我解决方案。
我们可以使用构造函数“.adaptive()”,它可用于某些 Cupertino Widgets,如 Switch 或 Sliders :
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Switch.adaptive(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
);
}
https://api.flutter.dev/flutter/material/Switch/Switch.adaptive.html
如果我们查看 Flutter 中的 Switch.adaptive 构建方法,我们可以看到它会为我们检查 PLatform:Theme.of(context).platform
当我们想要针对 Android 的平台特定 Widget 和针对 iOS 的 Cupertino Widget(如 Switch)时,如何避免代码重复?
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: (Platform.isAndroid)
? Switch(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
: CupertinoSwitch(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
);
}
我经常喜欢用我自己的小部件包装“标准”小部件 - 它允许您在一个地方控制它们。作为附带好处 - 仅在那些 Widget 类.
中进行代码重复我还看到有可能移出 onChanged 函数并将其两次分配给小部件的 onChanged 字段,如下所示:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: (Platform.isAndroid)
? Switch(
value: activate,
onChanged: _handleChange,
)
: CupertinoSwitch(
value: activate,
onChanged: _handleChange,
)
);
}
void _handleChange() => setState(() { activate = value; });
终于有人给了我解决方案。 我们可以使用构造函数“.adaptive()”,它可用于某些 Cupertino Widgets,如 Switch 或 Sliders :
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Switch.adaptive(
value: activate,
onChanged: (value) {
setState(() {
activate = value;
});
},
)
);
}
https://api.flutter.dev/flutter/material/Switch/Switch.adaptive.html
如果我们查看 Flutter 中的 Switch.adaptive 构建方法,我们可以看到它会为我们检查 PLatform:Theme.of(context).platform