Это на самом деле поведение, которое вы просите это сделать. Вы переходите в состояние (SignupVerificationEmailSentState
), а затем немедленно возвращаете его в другое состояние SignupInitialState
.
Вы вызываете raiseSnackBar()
, когда состояние is SignupVerificationEmailSentState
, что является правильным, но затем, как вы указали, представление перестраивается, потому что вы фактически возвращаете его назад, и у пользователя недостаточно времени, чтобы увидеть SnackBar
. await Future.delayed(Duration(seconds: 1))
фактически дает ему секунду, чтобы показать это.
Это не «плохой подход», он будет зависеть от потока вашего приложения и того, чего вы на самом деле пытаетесь достичь. Тем не менее, я бы предпочел
Future.delayed(Duration(seconds: 1)).then((_) => yield SignupInitialState());
, который не будет препятствовать выполнению каких-либо других инструкций после этой в вызове этого метода, при условии, что у вас их может быть. Если нет, это нормально.
Если вы хотите убедиться, что он возвращается в исходное состояние только после того, как SnackBar
отображается в течение 1 секунды, удалите эти две строки:
await Future.delayed(Duration(seconds: 1)); //Will not work without it.
yield SignupInitialState();
и вы можете сделать это примерно так:
Scaffold.of(context)
.showSnackBar(
SnackBar(
content: Text('Something...'),
duration: Duration(seconds: 1),
),
)
.closed
.then((_) => bloc.revertToSignupInitialState());