flutter 中的流可以保持打开状态吗?

Can streams in flutter be left open?

TL;DR:我可以让流在 flutter 中保持打开状态吗?

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

为了清楚起见,我想要的不是抽屉在屏幕顶部移动,而是相反。我希望主屏幕在顶部,抽屉在底部(根据 z-index)和主屏幕移动。

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

我在下面附上代码:

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

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

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

这是我的 stream/bloc class 的样子:

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

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

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

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

final Function(Widget w) onItemTap;

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

Drawer(this.onItemTap);

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

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

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

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

所以这是您最终的 drawer/menu 代码:

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 
}  ),
]
),
//...

希望有所帮助:)

是的,您可以打开流。 但它会影响您的应用程序性能,在我看来,这是一种用于简单回调操作的复杂方法。 这是我会做的:

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

final Function(Widget w) onItemTap;

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

Drawer(this.onItemTap);

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

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

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

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

所以这是您最终的 drawer/menu 代码:

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 
}  ),
]
),
//...

希望有所帮助:)