Flutter 是不是会在 iOS 中自动显示 Cupertino UI,在 Android 中使用单一代码库显示 Material?

Posted

技术标签:

【中文标题】Flutter 是不是会在 iOS 中自动显示 Cupertino UI,在 Android 中使用单一代码库显示 Material?【英文标题】:Does Flutter automatically display Cupertino UI in iOS and Material in Android with a single codebase?Flutter 是否会在 iOS 中自动显示 Cupertino UI,在 Android 中使用单一代码库显示 Material? 【发布时间】:2019-08-06 14:55:43 【问题描述】:

我需要知道 Flutter 是否会在 ios 上渲染 iOS Cupertino 风格,在 android 上渲染 Material 风格。在开始使用 Flutter 开发我的应用程序之前,我想知道这一点。

如果不是,我将如何在一个代码中管理两个不同的 UI?我不可能在代码的任何地方都使用 if/else。

【问题讨论】:

【参考方案1】:

您应该尝试图库应用:https://play.google.com/store/apps/details?id=io.flutter.demo.gallery&hl=en 在其中,当您按下菜单按钮时,您可以将平台机制设置为 Mountain View (Android) 或 Cupertino (iOS)。这样您就可以看到它在任一平台上的外观。

这是一个根据平台选择 Cupertino 或 Material 代码的示例:https://medium.com/flutter-io/do-flutter-apps-dream-of-platform-aware-widgets-7d7ed7b4624d 据我所知,您必须选择这样的小部件。

【讨论】:

【参考方案2】:

这些功能正在开发中。我建议查看这个库:https://pub.dartlang.org/packages/flutter_platform_widgets

除此之外,即使没有这个库,您也可以做很多事情。一切都取决于您的资源、要求和项目的复杂性。

例如,如果您是单独工作或在一个小团队中工作,您的项目的复杂性可能不会太大,并且您的整个应用程序最多只包含几十个 Widget 派生类。在这种情况下,也许您可​​以特意在自定义 Widget 类中对平台自适应行为进行编程,这样您就可以长期使用它们。

这个工作流程并不总是适用,一开始可能看起来很复杂,但以后会变得更自然。

【讨论】:

谷歌是否直接参与了这项功能的开发? 在使用 Flutter 平台小部件一年多之后,我现在建议不要使用它们。他们仍然需要大量定制(阅读:重复代码),我们最终最终将所有内容重新移植回 Material 设计。 @rgisi 库比蒂诺脚手架怎么样?我想要一个持久的底部导航栏,而 Cupertino Scaffold/Tabbar 似乎为这个问题提供了最好的解决方案【参考方案3】:

最近,Flutter 为 Switch、SwitchListTile 和 CircularProgressIndicator 添加了自适应构造函数,这将有助于在单个代码库中进一步推进平台感知小部件。虽然这些是目前仅有的三个,但期待未来更多!

【讨论】:

CircularProgressIndicator.adaptive() 也 这里是 Flutter 2.2.0 之前的所有版本中发布/完善的所有自适应小部件:自适应文本字段、自适应图标、自适应 TextInputAction、popup_menu 的自适应更多图标、VisualDensity.adaptivePlatformDensity。 flutter.dev/docs/development/tools/sdk/release-notes/…【参考方案4】:

下面的简单实现:

class AdaptiveSwitch extends StatelessWidget 
  const AdaptiveSwitch(Key key,
      @required this.value,
      @required this.onChanged,
      this.activeColor,
      this.dragStartBehavior = DragStartBehavior.start)
      : assert(dragStartBehavior != null),
        super(key: key);

  final bool value;

  final ValueChanged<bool> onChanged;

  final Color activeColor;

  final DragStartBehavior dragStartBehavior;

  @override
  Widget build(BuildContext context) 
    return Theme.of(context).targetPlatform = TargetPlatform.iOS
        ? CupertinoSwitch(
            value: value,
            activeColor: activeColor,
            onChanged: onChanged,
            dragStartBehavior: dragStartBehavior,
          )
        : Switch(
            value: value,
            activeColor: activeColor,
            onChanged: onChanged,
            dragStartBehavior: dragStartBehavior,
          );
  

【讨论】:

以上是关于Flutter 是不是会在 iOS 中自动显示 Cupertino UI,在 Android 中使用单一代码库显示 Material?的主要内容,如果未能解决你的问题,请参考以下文章

在通道 plugins.flutter.io/image_picke 上找不到方法 pickImage 的实现

Flutter 列显示 Android 中小部件之间的额外空间

Flutter 在 facebook 应用程序 android 和 ios 中打开 facebook 链接

八天让iOS开发者上手Flutter!

什么决定了 iOS 应用程序是不是会在 iOS 7 中获得新外观

八天让iOS开发者上手Flutter!