Как реализовать валидацию с помощью клавиатуры, выполненной кнопкой Flutter, наблюдаемой, streamBuilder - PullRequest
1 голос
/ 29 февраля 2020

Я создаю приложение с Flutter и Blo c, как архитектура. Я пытаюсь позвонить «отправить удовольствие» c не только кнопкой входа в систему, но и кнопкой «Готово» с паролем; только когда адрес электронной почты и пароль действительны.

Я мог бы реализовать версию кнопки входа с помощью combLatest, но я не уверен в версии клавиатуры. Мне нужно подтвердить и адрес электронной почты, и пароль, когда нажата кнопка «Готово» перед вызовом. Я мог бы вложить streamBuilder, но чувствую, что это нехорошая практика.

Есть ли какой-нибудь способ получить последнее значение от combLatest? BehaviorSubject<bool>().value Или любой возможный совет для реализации этого.

пример кода:


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

      // Add data to stream
      Stream<String> get email => _emailController.stream.transform(validateEmail);
      Stream<String> get password =>
          _passwordController.stream.transform(validatePassword);

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

      // change data
      Function(String) get changeEmail => _emailController.sink.add;
      Function(String) get changePassword => _passwordController.sink.add;

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

        print('Email is $validEmail, and password is $validPassword');
      }


    import 'package:flutter/material.dart';
    import '../blocs/bloc.dart';
    import '../blocs/provider.dart';

    class LoginScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final bloc = Provider.of(context);

        return Container(
          margin: EdgeInsets.all(20.0),
          child: Column(
            children: <Widget>[
              emailField(bloc),
              passwordField(bloc),
              Container(
                margin: EdgeInsets.only(top: 25.0),
              ),
              submitButton(bloc),
            ],
          ),
        );
      }

      Widget emailField(Bloc bloc) {
        return StreamBuilder(
          stream: bloc.email,
          builder: (context, snapshot) {
            return TextField(
              onChanged: bloc.changeEmail,
              keyboardType: TextInputType.emailAddress,
              decoration: InputDecoration(
                hintText: 'ypu@example.com',
                labelText: 'Email Address',
                errorText: snapshot.error,
              ),
            );
          },
        );
      }

      Widget passwordField(Bloc bloc) {
        return StreamBuilder(
            stream: bloc.password,
            builder: (context, snapshot) {
              return TextField(
                obscureText: true,
                onChanged: bloc.changePassword,
                decoration: InputDecoration(
                  hintText: 'Password',
                  labelText: 'Password',
                  errorText: snapshot.error,
                ),
                textInputAction: TextInputAction.done,
                onSubmitted: () {}, // <- here
              );
            });
      }

      Widget submitButton(Bloc bloc) {
        return StreamBuilder(
          stream: bloc.submitValid,
          builder: (context, snapshot) {
            return RaisedButton(
              child: Text('Login'),
              color: Colors.blue,
              onPressed: snapshot.hasData ? bloc.submit : null,
            );
          },
        );
      }
    }

image

1 Ответ

0 голосов
/ 02 марта 2020

Вы можете обернуть свой пароль streamBuilder с помощью другого streamBilder и метода отправки вызова onSubmitted.

Widget passwordField(Bloc bloc) {
    return StreamBuilder(
        stream: bloc.submitValid,
        builder: (context, snap) {
          return StreamBuilder(
        stream: bloc.password,
        builder: (context, snapshot) {
          return TextField(
            obscureText: true,
            onChanged: bloc.changePassword,
            decoration: InputDecoration(
              hintText: 'Password',
              labelText: 'Password',
              errorText: snapshot.error,
            ),
            textInputAction: TextInputAction.done,
            onSubmitted: snap.hasData ? bloc.submit : null,
          );
        });
     });
  }
...