私はブロックパターンとストリームのものに新しいです。ボタンを押したときに警告ダイアログを表示したいのですが、方法がわかりません。実際に私のコードは:
Widget button() {
return RaisedButton(
child: Text('Show alert'),
color: Colors.blue[700],
textColor: Colors.white,
onPressed: () {
bloc.submit();
});
}
return Scaffold(
appBar: AppBar(
title: Text("Title"),
),
body: StreamBuilder(
stream: bloc.getAlert,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text("I have Dataaaaaa ${snapshot.data}");
} else
return ListView(
children: <Widget>[
Container(
button()
)
...
そしてBLoC:
final _submissionController = StreamController();
Stream get submissionStream=> _submissionController.stream;
Sink get submissionSink=> _submissionController.sink;
私は次のようなことをやろうとしました:
Widget button() {
return StreamBuilder(
stream: submissionStream
builder: (context, snapshot){
if (snapshot.hasData){
return showDialog(...)
}else
return RaisedButton(
child: Text('Show alert'),
color: Colors.blue[700],
textColor: Colors.white,
onPressed: () {
bloc.submit();
});
}
しかし、もちろん、それは機能しませんでした。
ビルドが機能しているときはダイアログを表示できません。新しいデータを取得したら、新しいウィジェットを作成します。この場合はおそらくストリームを使用しない方が良いでしょうが、必要な場合は使用する必要があります
WidgetsBinding.instance.addPostFrameCallback((_)=> yourFunction(context));
または
Future.microtask(()=> showDialogFunction(context));
あなたの場合
if (snapshot.hasData) { WidgetsBinding.instance.addPostFrameCallback((_) => showDialogFunction(context)); }
このコードはビルドメソッドの後に起動されるため、ダイアログがすぐに表示されます。
Bloc関数は常にウィジェットを返すため、ストリームにデータがある場合は常にbutton()または別のウィジェットを返します
これは私がやったことですが、私も羽ばたくのが初めてなので間違っているかもしれません。しかし、私のシナリオでは機能します。
Widget build(BuildContext context) {
final authBloc = BlocProvider.of<AuthBloc>(context);
authBloc.outServerResponse.listen((serverResponse) {
if (serverResponse.status == 'success') {
_navigateToLogin();
} else {
_showSnakBar(serverResponse.message);
}
});
.... Rest of the code which returns the widget,
which in my case is form widget with button for submitting as follows,
onPressed: () {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
authBloc.processRegister.add(_registrationData.toMap());
}
}
outServerResponseは、API POST呼び出しの終了後に出力されるストリームです。
authBloc.processRegisterは、フォームデータをAuth APIサービスプロバイダーに渡すための入力シンクです。
_nagivateToLogin&_showSnakBarは単純な関数です
_navigateToLogin() {
Navigator.of(context).pop();
}
_showSnakBar(String msg) {
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text(msg),
),
);
}