Кнопка остается отключенной после изменения StreamController.broadcast() на BehaviorSubject()

#dart #flutter #stream #dart-pub #rxdart

#dart #трепетание #поток #dart-pub #rxdart

Вопрос:

Я использовал Streams и rxdart для проверки формы. Когда я использовал StreamController<String>.broadcast() логику включения-выключения кнопок, все работало нормально.

Изменение этого параметра на BehaviorSubject<String>() button остается отключенным, даже если логика верна.

bloc.dart

 import 'dart:async';

import 'package:login_validation_with_bloc/blocs/validator.dart';
import 'package:rxdart/rxdart.dart';

class Bloc with Validator {
  final _emailController = StreamController<String>.broadcast();
  final _passwordController = StreamController<String>.broadcast();

  Stream<String> get email => _emailController.stream.transform(validateEmail);

  Stream<String> get password =>
      _passwordController.stream.transform(validatePassword);

  Stream<bool> get validForm =>
      Observable.combineLatest2(email, password, (e, p) => true);

  Function(String) get changeEmail => _emailController.sink.add;

  Function(String) get changePassword => _passwordController.sink.add;

  dispose() {
    _emailController.close();
    _passwordController.close();
  }
}

final bloc = Bloc();
 

home.dart, два текстовых поля и кнопка отправки

 Widget emailTextField(context, Bloc bloc) => StreamBuilder(
        stream: bloc.email,
        builder: (context, snapshot) => TextField(
              decoration: InputDecoration(
                  labelText: "Email",
                  hintText: "Enter your email address",
                  errorText: snapshot.error,
                  border: UnderlineInputBorder()),
              keyboardType: TextInputType.emailAddress,
              onChanged: bloc.changeEmail,
            ),
      );

  Widget passwordTextField(context, Bloc bloc) => StreamBuilder(
        stream: bloc.password,
        builder: (context, snapshot) => TextField(
              decoration: InputDecoration(
                  labelText: "Password",
                  hintText: "Enter your password",
                  errorText: snapshot.error,
                  border: UnderlineInputBorder()),
              keyboardType: TextInputType.text,
              obscureText: true,
              onChanged: bloc.changePassword,
            ),
      );

  Widget submitButton(context, Bloc bloc) => StreamBuilder(
        stream: bloc.validForm,
        builder: (context, snapshot) {
          return Container(
            child: RaisedButton(
              color: Colors.blue,
              disabledColor: Colors.grey,
              textColor: Colors.white,
              disabledTextColor: Colors.white70,
              onPressed: snapshot.hasData amp;amp; !snapshot.hasError
                  ? () {
                      print("Submit button pressed");
                    }
                  : null,
              elevation: 5,
              disabledElevation: 0,
              child: Text("Submit"),
            ),
          );
        },
      );
 

Изменения

В bloc.dart

 final _emailController = BehaviorSubject<String>();
final _passwordController = BehaviorSubject<String>();

submit() {
    final validEmail = _emailController.value;
    final validPassword = _passwordController.value;

    print("ntEmail: $validEmailntPassword: $validPassword");
}
 

В home.dart

 snapshot.hasData amp;amp; !snapshot.hasError ? bloc.submit() : null,
 

Я ожидаю, что кнопка должна оставаться включенной, когда логика верна, и не должна вызывать метод до тех пор, пока кнопка не будет нажата

Ответ №1:

В home.dart:

Измените это:

 snapshot.hasData amp;amp; !snapshot.hasError ? bloc.submit() : null,
 

для этого

 snapshot.hasData amp;amp; !snapshot.hasError ? bloc.submit : null,
 

Объяснение:
С bloc.submit вами ссылаются на метод, а с bloc.submit() вами ссылаются на возвращаемое значение этого метода.

Что вы делали, так это то, что вы ссылались на возвращаемое значение этого метода, и поскольку вы ничего не возвращали, этот метод просто выполнялся, но поскольку возвращаемое значение было null, кнопка оставалась отключенной.