首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我正在尝试组合两个不同的列表视图,Streambuilders用于单个屏幕

在Flutter中,StreamBuilder是一个非常有用的widget,它可以监听一个流(Stream)并在流发出新数据时重建UI。当你需要在单个屏幕上组合两个不同的列表视图时,可以使用StreamBuilder来分别监听两个流,并将它们的数据合并后展示。

基础概念

StreamBuilder:一个Flutter widget,用于监听一个流并在流发出新数据时重建UI。

Stream:一个异步的数据序列,可以发出多个值。

相关优势

  1. 实时更新StreamBuilder允许UI实时响应流中的新数据。
  2. 高效重建:只重建需要更新的部分,而不是整个屏幕。
  3. 简化代码:通过组合不同的流,可以减少手动管理状态的复杂性。

类型与应用场景

类型

  • 单一流:监听一个流并展示其数据。
  • 多流组合:监听多个流并将它们的数据合并后展示。

应用场景

  • 实时聊天应用
  • 新闻推送
  • 实时数据监控

示例代码

假设我们有两个不同的流stream1stream2,我们希望将它们的数据合并后展示在一个列表中。

代码语言:txt
复制
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('StreamBuilder Example')),
        body: CombinedStreamBuilder(),
      ),
    );
  }
}

class CombinedStreamBuilder extends StatelessWidget {
  final Stream<int> stream1 = Stream.periodic(Duration(seconds: 1), (count) => count);
  final Stream<int> stream2 = Stream.periodic(Duration(seconds: 2), (count) => count * 10);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<int>>(
      stream: CombineLatestStream.combine2(stream1, stream2, (a, b) => [a, b]),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(child: CircularProgressIndicator());
        }
        return ListView.builder(
          itemCount: snapshot.data!.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item ${snapshot.data![index]}'),
            );
          },
        );
      },
    );
  }
}

可能遇到的问题及解决方法

问题1:数据不同步

  • 原因:两个流的更新频率不同,导致数据展示不一致。
  • 解决方法:使用CombineLatestStream.combine2或其他组合方法来确保数据同步。

问题2:性能问题

  • 原因:频繁重建UI导致性能下降。
  • 解决方法:使用ListView.builder或其他高效的列表构建方法,并确保只重建必要的部分。

问题3:错误处理

  • 原因:流中可能出现错误,导致应用崩溃。
  • 解决方法:在StreamBuilder中添加错误处理逻辑,例如使用catchError来捕获并处理异常。
代码语言:txt
复制
StreamBuilder<List<int>>(
  stream: CombineLatestStream.combine2(stream1, stream2, (a, b) => [a, b])
    .catchError((error) {
      print('Error: $error');
      return Stream.empty();
    }),
  builder: (context, snapshot) {
    // 构建UI
  },
);

通过以上方法,你可以有效地组合两个不同的列表视图,并处理可能遇到的问题。

相关搜索:我正在尝试得到两个数字的组合(概率)我正在尝试组合3个表,以获得不同的组合,如下所示我正在尝试删除列表中某个元素的单个匹配项如何将单个函数应用于对象列表中不同的属性组合?我正在尝试从名为clothingproducts的数组中导入不同的产品列表我正在尝试创建一个程序,该程序将打印属于两个不同组的人员列表我正在尝试为一个实体类在单个列中创建两个不同的表多对一映射我正在尝试用python编写一个mergesort,但是当我输入不同的列表时,输出是不同的。我正在尝试将芹菜应用于django中的基于类的视图(Apis)。我该怎么做呢?我正在尝试使用pandas.DataFrame.replace将包含列表的单元格替换为单个值?我正在尝试从SQL Server中列表in的标识中获取组合框数据,但遇到检索错误我希望它们是两个单独的列,它们都来自不同的表。我正在使用concat来组合原始变量当我们切换到具有相同父类但嵌套在两个不同div中的移动视图时,我正在尝试切换到节我正在尝试selenium来截取不同网站的屏幕截图,但有一个弹出式窗口遮挡了网站我正在尝试使用Winapi检查指定的窗口是否对屏幕可见,但不确定当两个窗口不重叠时如何处理我正在尝试将ansible输出格式化为item1 - item2,而不是两个单独的项目列表我正在尝试重新创建一个从一个屏幕到另一个屏幕的表视图,但一直收到错误信号sigbart我正在尝试显示两个图像,一个是地图图标,另一个是便利设施图标,两张独立的照片。我试过很多不同的方法我正在尝试创建一个模型,该模型生成一个由四个字符{a,b,c,d}组成的256个唯一组合的列表
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# WPF MVVM开发框架Caliburn.Micro Screens, Conductors 和 Composition⑦

GetChildren–调用此方法返回导体正在跟踪的所有项目的列表。如果导体使用“屏幕集合”,则返回所有“屏幕”,否则仅返回ActiveItem。...主要区别在于,与单个项目同时处于活动状态不同,许多项目可以处于活动状态。关闭项目将停用该项目并将其从集合中移除。 关于CMs IConductor实现,我还没有提到两个非常重要的细节。...在准备过程中,您可能希望至少仔细考虑或尝试做以下事情: 摆脱常规的TabViewModel。在真正的应用程序中,您不会真的做这样的事情。创建两个自定义视图模型和视图。...ViewModel Composition Caliburn.Micro的屏幕和导体最重要的特征之一是,它们是复合模式的实现,使它们易于以不同的配置组合在一起。...一般来说,组合是面向对象编程最重要的方面之一,学习如何在表示层中使用它可以带来很大的好处。为了了解构图在这个特定示例中的作用,让我们看两个屏幕截图。

2.6K20

如何在Ubuntu 16.04上使用dry管理和监控Docker容器

首次启动Dry时,此仪表板本身默认为Containers列表。 通过此视图,您可以查看主机容器的常规状态。...0.0.0.0:8080->80/tcp Network Name: bridge IP Address: 172.17.0.3 Labels 6 选择容器时,屏幕的下方中心还将显示可选选项的新列表...第五步 - 监控Docker容器 按M键可快速概览当前服务器/主机上所有正在运行的容器。可以从dry的任何根部分访问此屏幕,如Containers,Images和Networks。...此视图中的任务显示两个容器中的CURRENT STATE处于活动状态,并列出它们运行的时间。您自己的容器名称编号可能会有所不同。它取决于容器分配给哪个工作节点,这由Docker服务命令确定。...此视图确认了5/5副本处于活动状态,并显示服务正在使用的端口映射及其分布式任务。 我们可以使用dry来查看有关该服务的更多细节。高亮显示webserver服务时按ENTER键。

94560
  • 最新iOS设计规范四|3大界面要素:视图(Views)

    警示框标题和内容 尽可能写一些短小的、描述性比较强的多文本警告标题。屏幕上需要阅读的文字应该越少越好,可以尝试编写一个标题并且避免添加额外的信息。...所以如果你需要在一个屏幕中放置两个滚动视图时,尽量考虑允许它们在不同的方向进行滚动,如此可能对其相互间的影响是最小的。...拆分视图提供与选项卡栏相同的快速导航,同时更好地利用了大屏幕。 为每种类型的列选择适当的样式。对于显示侧栏的主列,请使用侧栏外观。此外观适用于应用程序级导航和集合列表,例如Mail中的邮箱。...对于显示列表视图的补充列,请使用普通边栏外观。这种外观适合于单个内容的列表,例如邮箱中的消息。 在主要和补充列中持续突出显示任务选择。...行可以被分隔为不同标记的部分,并且会有索引标记显示在屏幕右侧。页眉可以出现在一节中的第一项之前,页脚可以出现在最后一项之后。 ? 分组列表。

    8.5K31

    数据可视化工具Visdom

    以编程方式或通过用户界面来组织可视化空间,以创建实时数据的面板,来检查实验结果或调试实验代码。 概念 Visdom具有一组简单的特征,可以针对各种用例进行组合。...窗格中更新属性时触发 `propertyId`-在属性列表中的位置 `value`-新属性值 Click-单击“图像”窗格时触发,具有一个参数: `image_coord`-字典,其中x字段和y字段用于在可能缩放...选择环境 在主页上,可以使用环境选择器在不同的环境之间切换。选择新环境将向服务器查询该环境中存在的图。环境选择器允许搜索和过滤新的环境。 比较环境 从主页可以使用环境选择器比较不同的环境。...所以不要比较这种绘图上会收到大量更新的环境,因为每次更新都会要求重新生成比较。如果你需要比较接收大量数据的两个图,请让它们在单个env上共享相同的窗口。...注意:由于对行/列排序和ReactGridLayout的依赖,最终的布局可能与预期的略有不同。我们正在努力改善这种体验,或者提供替代方法以提供更好的控制。

    3.8K20

    Human Interface Guidelines —— 导航栏(Navigation Bars)

    自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚...Navigation Bars 位置 Navigation Bars显示在app屏幕的顶部,位于status bar(状态栏)下方,并可穿过一系列不同层级的屏幕进行导航。 ...有时,navigation bars的右侧包含一个control,如Edit或Done按钮,用于管理活动视图中的内容。 ...变化 ·在split view(分割视图)中,navigation bar可能出现在split view(分割视图)的单个窗格中。  ?...---- 导航栏标题(Navigation Bar Titles) 考虑在navigation bar中显示当前视图的标题。 在大多数情况下,标题可以帮助人们了解他们正在查看的内容。

    2.5K110

    UI自动化 --- UI Automation 基础详解

    它也是其他视图构建的基础。由于该视图依赖于底层UI框架,因此WPF按钮的原始视图将与Win32按钮的原始视图不同。...它包含传达用户界面中真实信息的UI项,包括可以接收键盘焦点的UI项以及一些不是UI项上的标签的文本。例如,下拉组合框中的值将出现在内容视图中,因为它们代表终端用户正在使用的信息。...例如,您可以使用 Invoke 控件模式来处理可以调用的控件(如按钮),并使用 Scroll 控件模式来处理带有滚动条的控件(如列表框、列表视图或组合框)。...ScrollItemPattern IScrollItemProvider 用于一种控件,该控件具有可滚动列表中的各个项。 例如,一个列表控件,该控件具有滚动列表中的各个项,如组合框控件。...SelectionItemPattern ISelectionItemProvider 用于选择容器控件中的各个项,如列表框和组合框。

    3.3K20

    如何在flutter中构建响应式布局(第五节)

    在继续在 Flutter 中构建响应式布局之前,我想说明一下 Android和iOS如何处理不同屏幕尺寸的原生布局。...它可用于创建适应不同屏幕尺寸和尺寸的灵活且响应迅速的 UI 设计。ConstraintLayout 允许您根据与布局中其他视图的空间关系为每个视图指定位置和大小。...这也适用于像智能手表这样的设备,它们的屏幕空间很小,调整组件大小以适应屏幕大小可能会导致奇怪的 UI。 2. 替代布局 为了解决上述问题,您可以为不同尺寸的设备使用替代布局。...在 Android 中,要在单个屏幕上显示多个 UI 视图,您可以使用 Fragments,它们就像可以在应用程序的 Activity 内运行的可重用组件。...AspectRatio小部件将子项调整为特定的纵横比。这个小部件首先尝试布局约束允许的最大宽度,然后通过将给定的纵横比应用于宽度来决定高度。

    2.9K10

    UITableView在Flutter中是什么?

    前面我们学习了文本、图片和按钮这些基本元素,这些基本元素需要进行排列组合,才能构成我们看到的UI视图。...那么,当这些基本元素的排列布局超过屏幕显示尺寸(即超过一屏)时,我们就需要引入列表控件来展示视图的完整内容,并根据元素的多少进行自适应滚动展示。...不过,这种创建方式要求提前将所有子Widget一次性创建好,而不是等到他们真正在屏幕上显示的时候才会创建,所以有一个很明显的缺点,就是性能不好。因此,这种方式仅适用于列表中含有少量元素的场景。...ListView的另一个构造函数ListView.builder,则适用于子Widget比较多的场景,这个构造函数有两个关键参数: itemBuilder,是列表项的创建方法。...下面我通过一个案例与你说明itemBuilder与itemCount这两个参数的具体用法。

    5.6K10

    SQL命令 CREATE VIEW(一)

    列名 视图可以有选择地包括用括号括起来的列名的列分隔符列表。 这些列名(如果指定的话)是在使用该视图时用于访问和显示列的数据的名称。...如果选择源表列名具有表别名,则在使用视图时用于访问和显示数据的名称中不会使用表别名。 如果省略列名列表,则还必须省略圆括号。...如果指定列COMMANCEL,则以下情况适用: 列名列表必须指定外围括号,即使指定单个字段也是如此。多个列名之间必须用逗号分隔。在列注释器中允许有空格和注释。...它们可以是与选择列名不同的名称、与选择列名相同的名称或两者的组合。视图列名的指定顺序与选择列名的顺序相对应。由于可以为视图列分配不相关的选择列的名称,因此在分配视图列名称时必须格外小心。...可以创建使用INTO子句指定SELECT的视图,但该视图的执行失败,并出现SQLCODE-25错误。 CREATE VIEW可以包含UNION语句,以从两个表的联合中选择列。

    6.4K21

    使用 Material Design 组件实现 Material 动效

    第一个是单个邮件列表项的卡片,我们将使用 数据绑定,来确保每一个列表项都有唯一的过渡名称。...在过渡过程中,通过传入页面在传出屏幕上淡入,容器的内容 (列表项和详情页) 发生了交换。...这是因为当过渡开始时,邮件列表的适配器还未被填充,过渡系统找不到与过渡名称对应的两个视图。...接下来,默认情况下,过渡会在场景根层次结构内的所有子视图上运行,这意味着一个共享轴过渡会应用于邮件列表上的每一封邮件以及搜索页面的每一个子视图。...这样,我们就在进出搜索页面时有了一个漂亮的共享 z 轴过渡!共享轴是一个非常灵活的过渡,可以应用于许多不同的场景,从页面过渡到智能回复选择,再到进入或者垂直的步骤流程。

    1.9K20

    UIKit Dynamics:开始入门 —《Graphics & Animation系列一》

    尝试修改这些属性以使对象以不同的加速度向上,侧向或对角线倾斜。 注:关于单位的简单说法:在物理世界中,重力(g)以米每平方秒表示,大约等于9.8米/秒2。...碰撞对象需要知道它应该与之交互的每个视图; 因此将障碍添加到物品列表中允许碰撞物体也作用于障碍物。...更新前面的图,可以看到碰撞行为现在与两个视图相关联: ? 但是,这两个对象之间的交互仍然存在不太正确的地方。...0.99192101, 0, 0] {154, 244} [0.97873402, 0.20513339, -0.20513339, 0.97873402, 0, 0] {157, 241} 在这里可以看到,动态引擎正在使用变换和帧偏移的组合来根据底层物理模型定位视图...虽然动态适用于这些属性的确切值可能没有多大意义,但知道它们正在被应用很重要。 因此,如果以编程方式更改对象的框架或转换属性,则可以预期这些值将被覆盖。

    1.9K30

    已中招!Android 基础面试常常吊死在这几个问题上……

    AsyncTask 可用于处理持续时间少于5毫秒的任务。使用 AsyncTask ,您可以更新与JavaThread不同的UI。但是,很多长时间运行的任务会降低性能。...RecyclerView 在显示较长的项目列表。假设我们要显示100行项目。一种简单的方法是只创建100个视图,每行一个视图,然后将它们全部布局。...但是通过这种方式,当您到达列表的末尾时,将创建100个视图,并且的内存使用情况将与第一种方法相同。创建视图需要花费时间,因此您的滚动很可能不会很流畅。...这就是为什么 RecyclerView 会利用以下事实:滚动时,新行出现在屏幕上,而旧行消失在屏幕上。代替为每个新行创建新视图,而是通过将新数据绑定到旧视图来对其进行回收和重用! 应聘者:我学到了!...RecyclerView 将列表与其容器分离,因此可以通过设置LayoutManager在运行时轻松地将列表项放在不同的容器(linearLayout,gridLayout)中。

    2K20

    安卓开发中的Model-View-Presenter(MVP模式)

    依赖项投资原则(DIP)只在一个方向得到了解(视图=>服务,而不是服务=>视图)。这个问题是存在的,因为两个方向上的依赖关系的给了我们更大的内聚性和更少的耦合,但也增加了复杂性。...这些是促使我们在编写应用程序时尝试找到更好解决方案的主要原因。...多亏了Presenter 层,它的唯一功能是将单个视图与单个应用程序服务(也称为interactor,或用例)连接起来;因此,为了构建一个屏幕,我们可以使用N个演示者,每个视图服务对一个。...为了说明我在本文中解释的内容,参考GitHub上一个小的示例/项目(纯模型-视图-演示者):Pure MVP in GitHub.。...此外,使用lambdas用于视图与服务通信,使我们能够避免直接暴露这些组件之间的可观数据。

    1.6K30

    折叠屏上应用设计规范,了解一下?

    △ 布局的三个主要区域 指南中的 组合部分 带您了解如何充分利用屏幕空间以保障可读性,并且以尊重用户心智模型的方式在不同的场景下合理排布重要内容和操作选项。...而且可以看到,Fortnightly 使用了视觉分隔线 (Visual Divider) 用于分隔最新新闻,在屏幕的另一边,则利用留白和排版对不同类别的新闻报道进行分组。...△ 栏式网格 您可以通过这些栏将屏幕划分为不同区域,用于容纳相关的信息和操作,进而改善信息层次结构。...规范布局 规范布局提供了一系列通用布局方案,对设计大屏幕应用非常有帮助。第一种是列表/详情,或列表网格视图的简单组合,同时在开始展示内容的屏幕起始侧,设置/不设置导航容器。...△ 列表/详情布局 支持面板可用于人们需要集中精力的体验中,例如文档。在屏幕尾侧或底部添加一块面板,以便于使用工具或上下文控件。

    4.5K20

    18个您想了解的微小但有用的macOS功能

    当您看到附近的绿色“+”号时,请释放该文件夹。然后,您将拥有一个新的自定义工具栏图标,该图标链接到该特定文件夹。 您无法通过自定义图标区分相同类型的不同文件夹或文件,因为这些图标是通用的。...将光标放在“键盘快捷键”字段中,按要用于书签的组合键,然后单击“添加”按钮。你去!现在,您可以使用该快捷方式加载加了书签的网页。 您将需要注意这一点:选择地址栏后,书签快捷方式将不起作用。...单击屏幕上的其他位置以取消焦点在地址栏。...4.跳回到搜索结果 在获取上面的屏幕截图时,我偶然发现了另一个功能:SnapBack。 当您单击Google之类的搜索结果中的链接,然后从一个网页跳至下一个网页时,回到您的搜索结果是很痛苦的,对吧?...按住Shift键,窗口仍会按比例缩放,但要沿拖动窗口边缘的方向缩放。 如果您需要用于缩放,移动和捕捉窗口的高级功能,请尝尝试使用以下macOS窗口管理工具之一。

    6.1K30

    Material Design — 菜单(Menus)

    自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚!...菜单 菜单的形式是在短暂的动作条上展示选项列表。 菜单出现在与按钮,操作或其他控件的交互中。菜单显示的是一个一行只有一个选项的选项列表。 如果不适用于某个情景,菜单项可能被禁用。...级联菜单 ---- 菜单项 单行展示 每个菜单项限于一行文本(单个单词或短语),用于描述选定时执行的操作。...---- 简单菜单(Simple Menus) 移动端或pc 使用列表中的简单菜单显示特定列表项的选项。 垂直对齐 靠近屏幕边缘时,简单菜单将垂直重新对齐,以使所有菜单项完全可见。...简单菜单 ·打开时,简单菜单会尝试将当前选定的菜单项目与列表项目垂直对齐。 当前选择的菜单项突出显示(如下图)。 ? 向下展开的简单菜单 ?

    5.8K100

    用这些 iOS 技巧让你的 APP 性能更佳

    01 使用看起来像应用首页的启动页 正如 Apple 人机界面指南 (HIG)里提到的, 启动屏幕可用于增强对应用程序响应能力的感知: 「它仅用于增强你的应用程序的感知,以便快速启动并立即使用。...在多任务屏幕中,我们可以看到已放在后台的应用程序列表。我们可以假设这些应用程序仍在后台运行;实际上,由于内存的需求,一些应用程序可能会被系统杀死并重新启动。...我们在多任务视图中看到的应用程序快照实际上是系统在退出应用程序时截取到的屏幕截图。(即转到主屏幕或多任务屏幕)。 ?...可以将恢复标识符组合在一起以形成恢复路径。标识符是通过视图层次结构来分组的,从根视图控制器到当前活动视图控制器。...按性能和能效排序的 QoS 值 (查看大图) Apple 提供了 一个简单的表格 其中包含用于不同任务的 QoS 值的示例。 需要记住,所有 UIKit 代码始终都应该在主线程上执行。

    3.2K30

    使用Firefox开发工具做性能审计

    您可以以不同的方式访问DevTools: 单击导航工具栏右边的菜单,单击Web Developer,然后选择要使用的子工具 使用键盘组合,比如Shift+F5 (Windows和macOS)作为性能工具...网络监视器向您显示了一个列表视图,其中包含了Firefox发出的所有网络请求(例如,当它加载页面时,或者发送xmlhttprequest,获取API请求等等)。...这个单线程负责运行浏览器正在执行的所有工作,如布局呈现、计算样式和收集垃圾。 还有一些方法,如setTimeout、诸如单击、加载和资源获取等事件,都是由单个线程执行的。...您可以使用颜色来区分不同视图中的操作,快速识别导致问题的操作类型,并在切换不同透视图时保持操作的类型。 ?...您可以通过这个菜单过滤掉您希望在图表和视图中看到的单个活动,您还可以看到与不同操作相关的不同颜色。 例如,如果使用CSS动画,您需要关注的是诸如重新计算样式、应用样式更改、布局和绘制等活动。

    3.5K40

    Google Earth Engine (GEE) ——Earth Engine Explorer (EE Explorer)使用最全解析(8000字长文)

    这两个组件的共同点是一组用于在数据目录和工作区之间切换的按钮以及一个搜索栏,您可以在其中按关键字和位置名称查找数据集和地点。按照上面的链接,您将进入工作区,如下图所示。...选择地图视图时,地图按钮下方将出现一个复选框,用于打开/关闭地形而不是路线图视图。选择卫星时,卫星按钮下方将出现一个复选框,允许您打开/关闭标签(边界、国家、城市、水体等)。...有关更改图层顺序的信息,请参见下文。 重复数据集 您还可以将相同的数据集添加两次,作为工作区中的两个单独图层。这样做的一个原因是查看同一数据集的两个不同时间片,以查看随时间的变化。...为了演示对单个波段的可视化,让我们尝试使用高程图层,然后尝试查看多波段 MCD43A4 天底反射数据的单个波段。...在这里,来自 EE Explorer 的两个屏幕剪辑被合并在一起并进行了注释,以传达有关 Landsat 记录的土地覆盖变化的信息。

    49410

    导航设计的10种模式

    04 宫格导航 描述: 宫格式导航被广泛应用于各平台系统的中心页面; 用在二级页作为内容列表的一种图形化形式呈现,或作为一系列工具入口的聚合; 用户频繁切换的概率是比较低; 在不同的文章中可能被称作:跳板...一般位于产品顶部,通过点击呼出导航菜单; 通常用来筛选同一信息模块下不同类别的信息,或者快速启动某些常用的功能模块,而不需要频繁的页面跳转 ; Android中对应的控件为spinner控件,但该控件用于同一类别下不同视图之间的切换...,而不是跳转至完全不同的视图。...优点: 菜单与界面的连贯性比抽屉式要好,容易让用户感知当前位置; 缺点: 位于屏幕上方,相对隐蔽且不能结合手势操作,不适合于频繁的切换功能使用; 考虑到导航菜单的可用面积较小,所以一般采用列表的形式展示菜单内容...10 组合式 描述: 一个网站或者APP内不可能只用一种导航,通常都是组合来使用。在不同使用场景下根据实际需要进行选择。但是通常主导航会对这个产品的格调起决定性作用。

    3.6K40
    领券