【问题标题】:Can streams in flutter be left open?颤动中的流可以保持打开状态吗?
【发布时间】:2020-08-23 16:20:30
【问题描述】:

TL;DR:我可以让流在颤动中打开吗?

我有一个特定的 UI 需要不同风格的应用程序抽屉,不像普通的侧边抽屉从左滑到主屏幕的顶部。 设计更像是整个主屏幕向右移动,底部有一层作为侧边栏。

为了清楚起见,把它想象成不是抽屉在屏幕顶部并移动,相反的是我想要的。我希望主屏幕位于顶部,抽屉位于底部(就 z-index 而言)并且主屏幕移动。

我所做的是创建了两个小部件,一个用于应用程序抽屉,另一个用于主屏幕,并使用堆栈小部件和一些动画使其工作。为了注册用户关于他/她想要打开哪个屏幕的反馈,我使用流将数据从侧边栏小部件传递到主屏幕小部件,并将其存储在主屏幕的本地状态中,并显示需要显示的任何内容那个。

我在下面附上代码:

这是我使用堆栈和动画使 UI 工作的主文件:

这就是我使用流注册用户反馈并将其发送到主屏幕的方式:

这就是我接收反馈并显示必须显示的页面的方式:

这就是我的流/块类的样子:

我的主要问题是关于方法,有没有更好的方法?我之所以这么问,是因为我知道流不应该保持打开状态,这会影响应用程序的性能。 但是使用这种方法,我必须让它一直打开,因为用户应该能够在任何给定时间选择所需的页面。

在这种情况下保持流打开是一种正常的做法,你能告诉我一些情况,如果存在这种情况,流必须保持打开状态吗? (例如,我认为 autosuggest/search-as-you-type 可能一直在使用流,是吗?)。

【问题讨论】:

  • 是的,如果需要,您可以让流保持打开状态。它不应该影响性能。另一方面,如果不再需要该流,则应将其关闭。在您的情况下,即是在处置创建 SidebarHandlingBloc 的小部件时。
  • 但它永远不会被处理掉。如果我在 dispose 函数中使用 print 语句对其进行测试,它永远不会打印到控制台。
  • 有道理,你的整个应用都需要那个抽屉。当您的应用程序被操作系统关闭/回收时,它将被清理
  • 没错,我明白。但我的问题只是关于应用程序何时运行,它是否会影响性能。如果有更好的方法来实现这个 UI。
  • 不,不会影响性能。

标签: android ios flutter flutter-layout mobile-application


【解决方案1】:

是的,您可以让信息流保持打开状态。 但这会影响您的应用程序性能,并且在我看来,对于简单的回调操作来说,这是一种复杂的方法。 这是我会做的:

** 在抽屉页面中: // 添加回调参数

final Function(Widget w) onItemTap;

// 将回调添加到抽屉的构造函数中

Drawer(this.onItemTap);

** 在抽屉的手势检测器中: // 在点击某个项目时,将此回调发送到您已实例化抽屉页面的页面。

onTap(){ widget.onItemTap( WidgetToShow() ) },

现在,当您在主屏幕的任何位置实例化抽屉类时,您就有了一个回调参数,您可以像这样使用:

Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  )

这是您最终的抽屉/菜单代码:

class Drawer extends StatefulWidget {
final Function(Widget w) onItemTap;
Drawer(this.onItemTap);
}
// ....
GestureDetector(
onTap: (){ return widget.onItemTap( WidgetToShow() ); },
),
// ...

这是您的主屏幕代码:

// ...
stack(
children:[
Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  ),
]
),
//...

希望有所帮助:)

【讨论】:

  • 感谢哥们的精彩回答,它非常原创且写得很漂亮。我是粉丝。
【解决方案2】:

简短的回答?是的,您可以让流保持打开状态。 但这会影响您的应用程序性能,并且在我看来,这是一种简单回调操作的复杂方法。 这是我会做的:

** 在抽屉页面中: // 添加回调参数

final Function(Widget w) onItemTap;

// 将回调添加到抽屉的构造函数中

Drawer(this.onItemTap);

** 在抽屉的手势检测器中: // 在点击某个项目时,将此回调发送到您已实例化抽屉页面的页面。

onTap(){ widget.onItemTap( WidgetToShow() ) },

现在,当您在主屏幕的任何位置实例化抽屉类时,您就有了一个回调参数,您可以像这样使用:

Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  )

这是您最终的抽屉/菜单代码:

class Drawer extends StatefulWidget {
final Function(Widget w) onItemTap;
Drawer(this.onItemTap);
}
// ....
GestureDetector(
onTap: (){ return widget.onItemTap( WidgetToShow() ); },
),
// ...

这是您的主屏幕代码:

// ...
stack(
children:[
Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  ),
]
),
//...

希望有所帮助:)

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2012-01-25
    • 1970-01-01
    • 2010-12-15
    • 2022-07-20
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多