Flutter 基于流的颤振反应导航

Flutter 基于流的颤振反应导航,flutter,stream,navigation,reactive-programming,flutter-navigation,Flutter,Stream,Navigation,Reactive Programming,Flutter Navigation,上下文 我正在构建一个蓝牙应用程序。此应用程序有4个选项卡,其中一个是bluetooth选项卡。此选项卡根据流值显示ListAllDevices页面或DeviceData页面。在ListAllDevices页面中,我搜索并连接到设备。在DeviceData页面中,我可以看到设备的一些数据并访问一些其他屏幕,例如DeviceSettings和其他DeviceSettings 我想做什么? 交互流程:第一次单击bluetooth选项卡时,我希望打开ListAllDevices页面。到达后,我将扫描

上下文

我正在构建一个蓝牙应用程序。此应用程序有4个选项卡,其中一个是bluetooth选项卡。此选项卡根据流值显示ListAllDevices页面或DeviceData页面。在ListAllDevices页面中,我搜索并连接到设备。在DeviceData页面中,我可以看到设备的一些数据并访问一些其他屏幕,例如DeviceSettings和其他DeviceSettings

我想做什么?

  • 交互流程:第一次单击bluetooth选项卡时,我希望打开ListAllDevices页面。到达后,我将扫描一些设备,当我单击连接到其中一个设备时,它将带我进入DeviceData页面。稍后,当我单击DeviceData页面中的按钮时,它将带我进入DeviceSettings页面

  • 反应流:我想继续监听蓝牙状态,如果蓝牙状态被禁用,则必须删除DeviceData页面的整个堆栈,并再次显示ListAllDevices页面(其状态必须与更改为DeviceData页面之前的状态相同)

到目前为止我做了什么?

交互流程很好:

  • 我有一个存储库,它将当前连接的设备作为单个值和流保存。当我单击手动连接或断开与设备的连接时,以及当流通知我蓝牙已禁用时,其值将更新

  • bluetooth页面的主要小部件是BluetoothTabPage,它只有一个StreamBuilder,可以根据所连接设备的值在ListAllDevices和DeviceData之间做出决定

  • DeviceData页面在某个点推送其他页面

摘要代码:

class BluetoothTabPage扩展StatefulWidget{
常量BluetoothTabPage();
@凌驾
_BluetoothTabPageState createState()=>_BluetoothTabPageState();
}
类_BluetoothTabPageState扩展状态{
StreamSubscription\u bluetoothStateSubscription;
@凌驾
void initState(){
_蓝牙订阅=
BluetoothManager.instance.bluetoothState().listen((bluetoothState){
if(bluetoothState!=常量BluetoothStateState.enabled()){
Repository.I.setConnectedDevice(const None());
}
});
super.initState();
}
@凌驾
无效处置(){
_bluetoothStateSubscription?.cancel();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:Repository.I.watchConnectedDevice,
initialData:Repository.I.connectedDevice,
生成器:(\ux,快照)=>snapshot.data.fold(
()=>const ListAllDevices(),
()=>const DeviceData(),
),
);
}
}
类ListAllDevices扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
连接的设备=某个设备;
}
}
类DeviceData扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
if(appbar操作){
显示设备设置;
}else if(appbar另一个操作){
显示其他设备设置;
}else if(用于断开连接的appbar操作){
连接设备=空;
}
}
}
类DeviceSettings扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
如果(应用程序条返回箭头)弹出到DeviceData;
}
}
类AnotherDeviceSettings扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
如果(应用程序条返回箭头)弹出到DeviceData;
}
}
反应流是问题所在:

  • 当我做
    连接的设备=某个设备时
    在ListAllDevices页面中,存储库发生更改,StreamBuilder侦听并显示DeviceData页面。很好

  • 当我执行
    连接的设备=空时
    在DeviceData页面中,存储库中连接的设备发生更改,StreamBuilder将侦听并再次显示ListAllDevices页面。到目前为止还不错

  • 当我导航到DeviceSettings页面并断开蓝牙连接时,什么也没发生,但我希望应用程序能将我带回ListAllDevices页面

  • 另一件事是:如果在
    DeviceSettingsPage
    页面中单击应用程序栏上的后退按钮,它将按预期显示
    ListalDevicesPage
    页面,这意味着StreamBuilder工作正常,只显示未弹出的按下的
    DeviceSettingsPage


所以,总的问题是:为什么它没有被弹出,我如何才能做到这一点?

为什么你没有得到答案?您不应该提供伪代码。这个问题可以是详细的。相反,你应该提供