Шаблон блока флаттера - как получить доступ к данным блока после навигатора - PullRequest
0 голосов
/ 19 января 2019

У меня есть приложение с 2 страницами, когда вкладка на кнопке домашней страницы переходит на страницу настроек.

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

Но на странице настроек все потоковые данные из моего блока имеют значение NULL.Понятия не имею почему, на домашней странице все хорошо.

Я добавил новые данные на страницу "Блок в настройках" в качестве теста, он отображается нормально, поэтому реализация блока работает нормально, просто не получая инициированные данные в конструкторе блока.

что я сделал не так?

Данные блока инициируются внутри конструктора блока, вот мой код блока

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 голосов
/ 19 января 2019

Я нашел проблему. Это должно произойти, когда StreamBuilder на странице настроек построен, он только слушает предстоящие данные, а не предыдущие данные. Для того, чтобы получить предыдущие данные, нам нужно несколько факторов рефакторинга.

В Bloc использует пакет BehaviorSubject из rxdart вместо streamController и определяет ValueObservable вместо Stream

  StreamController _selectedCurrencies = BehaviorSubject();
  ValueObservable get getSelectedCurrencies => _selectedCurrencies.stream;
  StreamSink get modifySelectedCurrencies => _selectedCurrencies.sink;

Затем на странице настроек укажите streamBuilder с начальными данными

initialData: appBloc.getSelectedCurrencies.value,

Это работает:)

...