Я хотел бы реализовать экран приветствия для моего приложения, который может переключаться с входа в систему, регистрироваться, с различными формами и кнопками, без изменения некоторых виджетов на экране (например, фона). Я пытался использовать тот же самый эшафот со стеком, все окружено 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';
}