J'ai un FloatingActionButton dans une arborescence de widgets qui a un BlocProvider
de flutter_bloc . Quelque chose comme ça:
BlocProvider(
builder: (context) {
SomeBloc someBloc = SomeBloc();
someBloc.dispatch(SomeEvent());
return someBloc;
},
child: Scaffold(
body: ...
floatingActionButton: FloatingActionButton(
onPressed: _openFilterSchedule,
child: Icon(Icons.filter_list),
),
)
);
Ce qui ouvre une feuille de fond modale:
void _openFilterSchedule() {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return TheBottomSheet();
},
);
}
J'essaie d'accéder à SomeBloc
à l'aide de BlocProvider.of<SomeBloc>(context)
à l'intérieur de TheBottomSheet
mais j'obtiens l'erreur suivante:
BlocProvider.of() called with a context that does not contain a Bloc of type SomeBloc.
J'ai essayé d'utiliser la solution décrite dans https://stackoverflow.com/a/56533611/2457045 mais ne fonctionne que pour BottomSheet
et non ModalBottomSheet
.
Remarque: Ceci n'est pas limité à BlocProvider
ou flutter_bloc
. Tout fournisseur du package provider a le même comportement.
Comment puis-je accéder à BlocProvider.of<SomeBloc>(context)
à l'intérieur de showModalBottomSheet
?
Dans le cas où il n'est pas possible de le faire, comment adapter https://stackoverflow.com/a/56533611/2457045 une solution à la feuille de fond modale?
Vous devez diviser le widget Scaffold et ses enfants, vers un autre StatefulWidget
à partir d'un seul widget
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
builder: (context) {
SomeBloc someBloc = SomeBloc();
someBloc.dispatch(SomeEvent());
return someBloc;
},
child: Scaffold(
body: ...
floatingActionButton: FloatingActionButton(
onPressed: _openFilterSchedule,
child: Icon(Icons.filter_list),
),
)
);
}
}
divisé en ces deux widgets
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
builder: (context) {
SomeBloc someBloc = SomeBloc();
someBloc.dispatch(SomeEvent());
return someBloc;
},
child: Screen(),
);
}
}
et ..
class Screen extends StatelessWidget {
void _openFilterSchedule() {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return TheBottomSheet();
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ...
floatingActionButton: FloatingActionButton(
onPressed: _openFilterSchedule,
child: Icon(Icons.filter_list),
),
);
}
}