Булево состояние обновления Flutter BloC - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы реализовать экран приветствия для моего приложения, который может переключаться с входа в систему, регистрироваться, с различными формами и кнопками, без изменения некоторых виджетов на экране (например, фона). Я пытался использовать тот же самый эшафот со стеком, все окружено BlocProvider. WelcomeBloc должен отвечать за смену форм между логином и формой регистрации. LoginBloc и registerBloc должны отвечать за управление состоянием и входами в двух формах. Пользовательский репозиторий предназначен для таких операций, как вход в систему с помощью Google и т. Д.

class WelcomeScreen extends StatefulWidget {
  @override
  _WelcomeScreenState createState() => _WelcomeScreenState();
}

class _WelcomeScreenState extends State<WelcomeScreen> {
  LoginBloc _loginBloc;
  RegisterBloc _registerBloc;
  WelcomeBloc _welcomeBloc;
  UserRepository _userRepository = UserRepository();

  @override
  void initState() {
    _loginBloc = LoginBloc(userRepository: _userRepository);
    _registerBloc = RegisterBloc(userRepository: _userRepository);
    _welcomeBloc = WelcomeBloc();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      bloc: _welcomeBloc,
      child: Scaffold(
        backgroundColor: Colors.black,
        resizeToAvoidBottomPadding: false,
        body: Stack(
          children: <Widget>[
            Opacity(opacity: 0.6, child: Background()),
            Padding(
              padding: const EdgeInsets.only(top: 130, left: 20),
              child: Text(
                "Welcome.",
                style: welcomeStyleBig,
              ),
            ),
            _welcomeBloc.getLogin
                ? BlocProvider(
                    bloc: _loginBloc,
                    child: LoginForm(
                      userRepository: _userRepository,
                    ),
                  )
                : BlocProvider(
                    bloc: _registerBloc,
                    child: RegisterForm(),
                  ),
          ],
        ),
      ),
    );
  }
}

Я пытался реализовать изменение формы с помощью логической переменной _isLogin в WelcomeBloc, но когда я нажимал на кнопкуОтветственный за обновление, ничего не появляется, пока я не перезагрузил приложение. Может быть, я не очень хорошо разбирался в шаблонах блоков.

Вот мои приветственные файлы блоков.

welcome_bloc.dart

class WelcomeBloc extends Bloc<WelcomeEvent, WelcomeState> {
  @override
  WelcomeState get initialState => InitialWelcomeState();

  bool _isLogin = true;

  bool get getLogin => _isLogin;

  @override
  Stream<WelcomeState> mapEventToState(
    WelcomeEvent event,
  ) async* {
    if (event is SwitchToLogin) {
      _isLogin = true;
      yield WelcomeLogin();
    }
    if (event is SwitchToRegister) {
      _isLogin = false;
      yield WelcomeRegister();
    }
  }
}

welcome_event.dart

abstract class WelcomeEvent extends Equatable {
  WelcomeEvent([List props = const []]) : super(props);
}

class SwitchToLogin extends WelcomeEvent {
  @override
  String toString() {
    return "Switch to Login";
  }
}

class SwitchToRegister extends WelcomeEvent {
  @override
  String toString() {
    return "Switch to Register";
  }
}

welcome_state.dart

abstract class WelcomeState extends Equatable {
  WelcomeState([List props = const []]) : super(props);
}

class InitialWelcomeState extends WelcomeState {
  @override
  List<Object> get props => [];
}

class WelcomeLogin extends WelcomeState {
  @override
  String toString() => 'Welcome Login';
}

class WelcomeRegister extends WelcomeState {
  @override
  String toString() => 'Welcome Register';
}

1 Ответ

0 голосов
/ 31 октября 2019

Чтобы обновить состояние виджета, вам нужен BlocBuilder, а не BlocProvider.

  • BlocProvider предоставляет блок своим дочерним элементам.
  • BlocBuilder обрабатывает создание виджета в ответ на новые состояния.

Также вы используете

BlocProvider(
   bloc: _loginBloc,

BlocProvider получает builder: в качестве параметра, а не `bloc:«Я не могу понять, как вы не получаете ошибку.

В вашем случае вы можете сделать что-то вроде кода ниже. (Вероятно, есть много ошибок, но вы можете понять концепцию)

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

Так что я думаю, что решение должно быть примерно таким:

BlocBuilder<WelcomeEvent, WelcomeState>(
  bloc: _welcomeBloc, // provide the local bloc instance
  builder: (context, state) {
    if(state is SwitchToLogin){
      return BlocProvider(
          builder: (BuildContext context) => _loginBloc,
          child: LoginForm(
            userRepository: _userRepository,
          ),
        );
    }
    else{
      return BlocProvider(
          builder: (BuildContext context) =>_registerBloc,
          child: RegisterForm(),
        );
    }
  }
);

надеюсь, это поможет

...