Flutter: Observable.combineLatest2 не транслируется, когда страница загружается через навигацию

Я создаю приложение флаттера с блоками.

Я следил за кодом, доступным в Flutter login с блоками

Он работает, как ожидалось, если в моем приложении не определены маршруты

class App extends StatelessWidget {
  Widget build(BuildContext context) {
    return Provider(
      child: MaterialApp(
        title: 'Log Me In!',
        home: Scaffold(
          body: LoginScreen(),
        ),
      ),
    ); 
  }
}

но когда я меняю свое приложение на использование маршрутов

class App extends StatelessWidget {
  Widget build(BuildContext context) {
    return  MaterialApp(
        title: 'Log Me In!',
        routes: {
          '/':(context) => Provider(
            child: Scaffold(
              body: LoginScreen(),
            ),
          )
        },
       );
  }
}

код блока

class Bloc extends Object with Validators {
  final _email = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();

  // retrieve data from stream
  Stream<String> get email    => _email.stream.transform(validateEmail);
  Stream<String> get password => _password.stream.transform(validatePassword);
  Stream<bool>   get submitValid => Observable.combineLatest2(email, password, (e, p) => true);

  // add data to stream
  Function(String) get changeEmail    => _email.sink.add;
  Function(String) get changePassword => _password.sink.add;

  submit() {
    final validEmail    = _email.value;
    final validPassword = _password.value;

    print('$validEmail and $validPassword');
  }

  dispose() {
    _email.close();
    _password.close();
  }
}

Observable.combileLatest2 не передает данные (но передает ошибку).

Используя Rxdart версии 0.19.0 и

Flutter 1.0.0 • бета-версия канала • https://github.com/flutter/flutter.git Framework • версия 5391447fae (6 дней назад) • 2018-11-29 19: 41: 26-0800 Двигатель • версия 7375a0f414 Инструменты • Dart 2.1.0 (сборка 2.1.0-dev.9.4 f9ebf21297)

Я что-то здесь делаю не так? заранее спасибо


person user1996206    schedule 05.12.2018    source источник


Ответы (1)


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

Поэтому, когда он создает страницу несколько раз, он создает несколько Observable в блоке, поскольку он создает новый экземпляр Bloc каждый раз, когда он создает маршрут страницы.

Итак, когда я изменяю код

class App extends StatelessWidget {
  final login = Provider(
            child: Scaffold(
              body: LoginScreen(),
            ),
          );
  Widget build(BuildContext context) {
    return  MaterialApp(
        title: 'Log Me In!',
        routes: {
          '/':(context) => login,
        },
       );
  }
}

он работал отлично.

Другой способ - создать виджет с отслеживанием состояния и выполнить инициализацию в методе инициализации.

person user1996206    schedule 19.12.2018