Dart Flatter Bloc模式--如何在navigator之后访问Bloc数据

Dart Flatter Bloc模式--如何在navigator之后访问Bloc数据,dart,flutter,navigator,bloc,Dart,Flutter,Navigator,Bloc,我有一个2页的应用程序,当主页按钮上的选项卡导航到设置页面时 IconButton( onPressed:(){ Navigator.push( context, MaterialPageRoute( builder: (context) => Settings()) ); }, ), 但在“设置”页面上,来自我的bloc的流数据都是空的。我不知道为什么,在主页上都很好 作为测试,我在设

我有一个2页的应用程序,当主页按钮上的选项卡导航到设置页面时

IconButton( 
    onPressed:(){ 
        Navigator.push(
            context, 
            MaterialPageRoute( builder: (context) => Settings())
        );
    },
),
但在“设置”页面上,来自我的bloc的流数据都是空的。我不知道为什么,在主页上都很好

作为测试,我在设置页面的Bloc中添加了新数据,它显示得很好,因此Bloc实现工作正常,只是没有在Bloc构造函数中获取启动的数据

我做错了什么

Bloc数据在Bloc构造函数中启动,下面是我的Bloc代码

class StateBloc implements BlocBase {

  var selectedCurrencies;

  StreamController<List> _selectedCurrencies = StreamController<List>.broadcast();
  Stream<List> get getSelectedCurrencies => _selectedCurrencies.stream;
  StreamSink get modifySelectedCurrencies => _selectedCurrencies.sink;

   StateBloc() {
      selectedCurrencies = ['cny','aud','usd'];
      modifySelectedCurrencies.add(selectedCurrencies);
  }
}
class StateBloc实现BlocBase{
var选择的货币;
StreamController _selectedcurrences=StreamController.broadcast();
Stream get getselectedcurrences=>_selectedcurrences.Stream;
StreamSink get ModifySelectedCurrences=>\u selectedCurrences.sink;
国家集团(){
所选货币=[‘人民币’、‘澳元’、‘美元’];
修改选定货币。添加(选定货币);
}
}
下面是如何将bloc提供给main.dart

Future<void> main() async{
  return runApp(
    BlocProvider<StateBloc>(
        child: MyApp(),
        bloc: StateBloc(),
    ),
  );
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Exchange',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(fontFamily: 'Poppins'),
      home: MyHomePage(),
    );
  }
}
Future main()异步{
返回runApp(
BlocProvider(
子项:MyApp(),
bloc:StateBloc(),
),
);
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:"交易所",,
debugShowCheckedModeBanner:false,
主题:主题数据(fontFamily:“罂粟花”),
主页:MyHomePage(),
);
}
}
这是我的设置页面

class Settings extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    final StateBloc appBloc = BlocProvider.of<StateBloc>(context);
    return MaterialApp(
      home: Scaffold(
        body: ListView(
          children: <Widget>[
            StreamBuilder(
              stream: appBloc.getSelectedCurrencies,
              builder: (context, selectedCurrenciesSnap) {
                  print('alllll --> ${allCurrenciesSnap.data}');
              }
            )
           ]
         )
       )
      )
   }
 }
类设置扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
final StateBloc appBloc=BlocProvider.of(上下文);
返回材料PP(
家:脚手架(
正文:ListView(
儿童:[
StreamBuilder(
流:appBloc.GetSelectedCurrences,
生成器:(上下文,所选的Currencessnap){
打印('alllll-->${allcurrencessnap.data}');
}
)
]
)
)
)
}
}

我发现了问题。这意味着在构建“设置”页面中的StreamBuilder时,它只监听即将到来的数据,而不是先前的数据。为了获得以前的数据,我们需要重构一些东西

在Bloc中,使用rxdart包中的BehaviorSubject而不是streamController,并定义ValueObservable而不是Stream

  StreamController _selectedCurrencies = BehaviorSubject();
  ValueObservable get getSelectedCurrencies => _selectedCurrencies.stream;
  StreamSink get modifySelectedCurrencies => _selectedCurrencies.sink;
然后在“设置”页面中,向streamBuilder提供初始数据

initialData: appBloc.getSelectedCurrencies.value,
这是有效的:)