web-dev-qa-db-fra.com

Comment accéder à la valeur Provided (Provider.of ()) dans showModalBottomSheet?

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?

7
Henrique Arthur

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),
      ),
    );
  }
}
0
ejabu