Flutter 中基于平台自动选择原生组件/小部件

Posted

技术标签:

【中文标题】Flutter 中基于平台自动选择原生组件/小部件【英文标题】:Automatically select native components/widgets based on platform in flutter 【发布时间】:2020-05-09 09:11:14 【问题描述】:

flutter中如何根据平台自动选择组件/widget。

例如,如果我们在 ios 中使用下拉菜单,它应该是一个选择器,而在 android 中它应该是弹出窗口和 web 上的普通下拉菜单。

本机组件将在 UI/UX 角度提供额外的良好外观。

如果我们对每个小部件进行平台检查,代码就会变得混乱。

例如:

Cupertino 选择器示例

GestureDetector(
            child: Text("Date"),
            onTap: () 
              showModalBottomSheet(
                  context: context,
                  builder: (BuildContext builder) 
                    return Scaffold(
                        appBar: AppBar(
                          title: Text(
                            "CupertinoPicker",
                            textAlign: TextAlign.justify,
                          ),
                          backgroundColor: Colors.teal,
                          actions: <Widget>[
                            IconButton(
                              icon: Icon(Icons.send),
                              onPressed: () ,
                            )
                          ],
                        ),
                        body: Container(
                          child: CupertinoPicker(
                            magnification: 1.5,
                            backgroundColor: Colors.black87,
                            children: <Widget>[
                              Text(
                                "TextWidget",
                                style: TextStyle(
                                    color: Colors.white, fontSize: 20),
                              ),
                              MaterialButton(
                                child: Text(
                                  "Button Widget",
                                  style: TextStyle(color: Colors.white),
                                ),
                                color: Colors.redAccent,
                              ),
                              IconButton(
                                icon: Icon(Icons.home),
                                color: Colors.white,
                                iconSize: 40,
                                onPressed: () ,
                              )
                            ],
                            itemExtent: 50, //height of each item
                            onSelectedItemChanged: (int index) 
                              selectitem = index;
                            ,
                          ),
                        ));
                  );
            ,
          ),

在这里,我集成了一个样本选择器,并为它的集成花费了很多行,而在 android 中则没有原生的感觉。在ios里很好看。

【问题讨论】:

希望对您有所帮助:medium.com/@mehmetf_71205/… @KaranMehta 我想通过不为原生组件编写两个部分来减少编码工作。使用单个 Widget 会更好。 @SanjeevS 只需检查这个插件pub.dev/packages/flutter_platform_widgets 由于 Flutter 不使用原生元素(它是绘制自己的元素),您需要指定在哪个平台上使用哪个小部件。 【参考方案1】:

您可以编写任何支持这两种平台的小部件:

class ProgressBar extends StatelessWidget 

  @override
  Widget build(BuildContext context) 
    return Theme
        .of(context)
        .platform == TargetPlatform.iOS ?
    CupertinoActivityIndicator() : CircularProgressIndicator();
  

因此,上述方法相应地构建了 iOS 和 android/fuchsia 小部件。您可以像这样定义任何小部件

【讨论】:

以上是关于Flutter 中基于平台自动选择原生组件/小部件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 的小部件不是真正自适应的意思

Flutter 组件介绍

如何让 Flutter 小部件适应不同的屏幕尺寸

如何在颤动中管理开关小部件的原生外观

如何使用flutter和kotlin在应用程序之外拥有小部件?

如何在 Flutter 中相对于另一个小部件定位小部件?