抖动Bloc模式-如何在导航器后访问bloc数据

时间:2019-01-19 03:00:58

标签: dart flutter navigator bloc

我有一个包含2个页面的应用程序,当使用“主页”按钮上的标签时,它会导航到“设置”页面。

IconButton( 
    onPressed:(){ 
        Navigator.push(
            context, 
            MaterialPageRoute( builder: (context) => Settings())
        );
    },
),

但是在“设置”页面上,来自我的集团的流数据全部为NULL。我不知道为什么,主页上的一切都很好。

我在“设置”页面的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);
  }
}

这是将块提供给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(),
    );
  }
}

这是我的设置页面

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}');
              }
            )
           ]
         )
       )
      )
   }
 }

1 个答案:

答案 0 :(得分:3)

我发现了问题。这是有可能发生的,当在“设置”页面中构建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,

这有效:)