web-dev-qa-db-fra.com

Comment accéder aux fournisseurs de fournisseurs dans les dialogues dans le flutter

Le package de fournisseur utilise InheritedWidget. C'est un problème lorsque je veux accéder à un fournisseur lorsque je suis dans une boîte de dialogue. Si je charge une boîte de dialogue en utilisant

 showDialog(... builder: (context) => MyDialog);

Je ne peux rien accéder à l'aide de InheritedWidget parce que ma boîte de dialogue ne fait partie de l'arborescence principale du widget. Cela signifie également que je ne peux pas accéder à mes prestataires de fournisseurs, correct?

Ma question est la suivante: comment puis-je accéder à mes fournisseurs dans une boîte de dialogue si ce n'est pas une partie de l'arborescence du widget d'application principale?

final firebaseAuth = Provider.of<FirebaseAuth>(context);

J'ai le même problème à utiliser BLoCs. Si j'essaie de les récupérer dans une boîte de dialogue via InheritedWidget, ils échouent. Je suis arrivé autour de cela en passant le BLoC dans le constructeur, mais cela semble vaincre le but de InheritedWidgets.

10
JustLearningAgain

Si c'est une option pour vous, soulevez simplement le fournisseur ci-dessus MaterialApp. Cela pourrait être une bonne solution pour les fournisseurs uniques globalement, par exemple Configurations utilisateur ou similaires: enter image description here

0
rgisi

J'ai été confronté au même problème aujourd'hui et j'ai pu travailler autour de lui en enveloppant la boîte de dialogue dans un constructeur d'état et en définissant l'état dans le nouvel arbre de widget.

      context: context,
      builder: (context) {
        return StatefulBuilder(builder: (context, setState) {
          return Dialog(
            child: SingleChildScrollView(
              child: Container(
                child: SingleChildScrollView(
                  child: Column(
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: height * .05),
                        child: Text('Choose An Avatar'),
                      ),
                      Stack(
                        children: <Widget>[
                          Align(
                            alignment: Alignment.center,
                            child: CircleAvatar(
                              minRadius: width * .09,
                              maxRadius: width * .09,
                              backgroundColor: Colors.brown,
                              backgroundImage: AssetImage(
                                  'assets/profile${appData.avatar}.png'),
                            ),
                          ),
                          Positioned.fill(
                            left: width * .04,
                            child: Align(
                              alignment: Alignment.centerLeft,
                              child: Container(
                                width: width * .18,
                                child: Material(
                                  color: Colors.transparent,
                                  child: InkWell(
                                    child: Icon(Icons.arrow_left,
                                        size: width * .18),
                                    onTap: () {
                                      setState(() {
                                        appData.changeAvatar();
                                      });
                                    },
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ),
          );
        });
      });
0
Onuoha Obinna

J'ai pu accéder aux données de fournisseur en passant dans les données définies dans la boîte de dialogue ALERT. Fait intéressant, vous devez appeler SSTATE () dans la boîte de dialogue afin de voir les modifications de votre boîte de dialogue.

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {

    final provider = Provider.of<DataSet>(context);

    return Scaffold(
      body: Container(
        child: RaisedButton(
        child: Text('Show Dialog'),
          onPressed: () {
            showDialog(context: context,
            builder: (context) {
              return DialogContent(dataSet: provider);
            });
          },
        ),
      ),
    );
  }
}

class DialogContent extends StatefulWidget {

  final DataSet dataSet;

  const DialogContent({Key key, this.dataSet}) : super(key: key);

  @override
  _DialogContentState createState() => _DialogContentState();
}

class _DialogContentState extends State<DialogContent> {
  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('Dialog with data'),
      content: Text('${widget.dataSet.pieceOfData}'),
      actions: <Widget>[
        FlatButton(
          child: Text('Increase Data'),
          onPressed: () {
            setState(() {
              widget.dataSet.increaseData();
            });
          },
        ),
      ],
    );
  }
}

class DataSet with ChangeNotifier {
  int pieceOfData = 1;

  increaseData() {
    pieceOfData += 1;
    notifyListeners();
  }
}
0
Eric Duffett