0

当我们想要适用于 Android 的平台特定小部件和适用于 iOS 的 Cupertino 小部件(如 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;
                    });
                   },
                 )
              );
             }
4

2 回答 2

0

终于有人给了我解决方案。我们可以使用构造函数“.adaptive()”,它可用于某些 Cupertino 小部件,如 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

于 2020-11-28T00:05:29.113 回答
0

我经常喜欢用我自己的小部件包装“标准”小部件——它允许你在一个地方控制它们。并且作为附带好处 - 仅在那些 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; });

于 2020-11-27T18:06:39.827 回答