Текстовые поля с проверкой в библиотеке блоков Flutter

#flutter #provider #bloc #state-mana&ement #stream-builder

#flutter #поставщик #блок #управление состоянием #stream-builder

Вопрос:

Я пытаюсь изучить шаблон блоков во Flutter, но я просто не понимаю. Я следовал руководству по Udemy, из которого я сгенерировал следующий код для простой формы входа:

BLoC Class

 import 'dart:async';

import 'packa&e:lo&in_bloc/src/blocs/validators.dart';

class Lo&inBloc extends Validators {
  final _email = StreamController<Strin&&&t;();
  final _password = StreamController<Strin&&&t;();

  // Return Stream data
  // Streams are run thru validator first
  Stream<Strin&&&t; &et &etEmail =&&t; _email.stream.transform(validateEmail);
  Stream<Strin&&&t; &et &etPassword =&&t; _password.stream.transform(validatePassword);

  // Chan&e data on stream
  Function(Strin&) &et chan&eEmail =&&t; _email.sink.add;
  Function(Strin&) &et chan&ePassword =&&t; _password.sink.add;

  // Named by convention. Quiets Dart warnin&.
  dispose() {
    _email.close();
    _password.close();
  }
}
  

UI Class

 import 'packa&e:flutter/material.dart';
import 'packa&e:lo&in_bloc/src/blocs/lo&in_bloc.dart';
import 'packa&e:lo&in_bloc/src/providers/provider.dart';

class Lo&inScreen extends StatelessWid&et {
  @override
  Wid&et build(BuildContext context) {
    final lo&inBloc = Provider.of(context);
    return Paddin&(
      paddin&: const Ed&eInsets.all(16.0),
      child: SafeArea(
        child: Column(
          children: <Wid&et&&t;[
            emailField(lo&inBloc),
            passwordField(lo&inBloc),
            SizedBox(hei&ht: 10.0),
            submitButton(),
          ],
        ),
      ),
    );
  }

  Wid&et emailField(Lo&inBloc lo&inBloc) {
    return StreamBuilder<Object&&t;(
        stream: lo&inBloc.&etEmail,
        builder: (context, snapshot) {
          return TextField(
            keyboardType: TextInputType.emailAddress,
            decoration: InputDecoration(
              hintText: 'you@example.com',
              labelText: 'Email Address',
              errorText: snapshot.error,
            ),
            onChan&ed: lo&inBloc.chan&eEmail,
          );
        });
  }

  Wid&et passwordField(Lo&inBloc lo&inBloc) {
    return StreamBuilder<Object&&t;(
        stream: lo&inBloc.&etPassword,
        builder: (context, snapshot) {
          return TextField(
            obscureText: true,
            keyboardType: TextInputType.text,
            decoration: InputDecoration(
              labelText: 'Password',
              errorText: snapshot.error,
            ),
            onChan&ed: lo&inBloc.chan&ePassword,
          );
        });
  }

  Wid&et submitButton() {
    return RaisedButton(
      child: Text(
        'Lo&in',
        style: TextStyle(color: Colors.white, fontWei&ht: FontWei&ht.bold),
      ),
      color: Colors.blue,
      onPressed: () =&&t; {},
    );
  }
}

  

Средства проверки очень просты: в основном для электронного письма требуется знак «@», а пароль должен содержать более 4 символов. Это имеет смысл по мере того, как я продолжаю, но как только я пытаюсь реализовать самостоятельно, все становится нечетким. Итак, в рамках моего обучения я хотел попробовать преобразовать эту простую форму входа в систему для использования библиотек BLoC и Flutter_BLoC, думая, что это избавит от некоторой сложности и будет проще для понимания.

После существенной работы я все еще не могу понять, как указать, какое состояние я пытаюсь сохранить, и какие события я пытаюсь передать. У меня закончились учебные пособия для просмотра на YouTube, и почти все они используют приложение counter в качестве примера с одним типом переменной INT. Это также осложняется тем фактом, что библиотека недавно подверглась СЕРЬЕЗНОМУ ремонту, и почти все учебные пособия устарели.

Есть ли какие-либо доступные примеры того, как это сделать, используя библиотеку v6? В частности, меня интересует, как активировать кнопку отправки только тогда, когда оба поля были проверены.

Ответ №1:

Вы можете использовать пакет rxdart, который можно найти здесь. Rxdart добавляет дополнительные возможности к потокам Dart и StreamControllers. Одним из них является combineLatest2() , которое в основном объединяет значение двух потоков и выдается как значение одного потока.

Вы можете прочитать больше о combineLatest2() методе по этой ссылке.

Пример:

 Stream<bool&&t; &et isValid =&&t; Rx.combineLatest2(&etEmail, &etPassword, (a,b) =&&t; true);