Доступ к переменной дочернего виджета в родительском виджете (Flutter with Dart) - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть кнопка, которая при нажатии открывает модальный нижний лист. Лист имеет виджет формы, который принимает несколько текстовых полей и изображение (из галереи / камеры). Для этого изображения я создал другой виджет с состоянием, который вызывается в предыдущем представлении (модальный лист). Теперь файл изображения, полученный через пользователя, устанавливается в переменную в дочернем виджете с отслеживанием состояния. У меня вопрос, как я могу получить доступ к этой переменной (объект File в дочернем виджете) внутри родительского виджета?

Пожалуйста, обратитесь к следующему коду:

Нижний лист: (См. Комментарий, где вызывается дочерний виджет.)

        context: _scaffoldKey.currentContext,
        builder: (BuildContext context) {
          return Scaffold(
              backgroundColor: Colors.white,
              appBar: AppBar(
                elevation: 0.0,
                automaticallyImplyLeading: false,
                backgroundColor: Colors.white,
                title: Center(
                  child: _formTitleWidget(),
                ),
              ),
              body: Container(
              height: MediaQuery.of(context).size.height* 0.5,
              margin: EdgeInsets.all(MediaQuery
                  .of(context)
                  .copyWith()
                  .size
                  .width * 0.05),
              child: Form(
                key: _addChildFormKey,
                child: SingleChildScrollView(
                  child: Container(
                    height: MediaQuery.of(context).size.height* 0.4,
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        // Calling the child widget here - where 'image' variable is set
                        AddChildView(),
                        Container(
                          height: MediaQuery.of(context).size.height* 0.4,
                          width:  MediaQuery.of(context).size.width* 0.65,
                          child: Column(
                            children: [
                              _childNameInput(),
                              _childBirthDateInput(),
                              _childHeightInput(),
                              _childWeightInput(),
                              _addChildWithInfo()
                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                ),
              ),
            )
          );
        }```

1 Ответ

0 голосов
/ 30 сентября 2019

Если вы не используете решение для управления состоянием, вам придется использовать обратный вызов.

Создать переменную в родительском элементе. Создайте метод, который принимает значение и присваивает его только что созданной переменной.

Создайте конечную функцию и добавьте ее в конструктор вашего потомка. Теперь, когда вы создадите экземпляр Child Widget в Parent, он примет только что созданный вами метод.

При необходимости запустите функцию в вашем потомке.

class ParentWidget extends StatelessWidget {
  Image image;

  callBack(Image imageFromChild) {
    this.image = imageFromChild;
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

class ChildWidget extends StatelessWidget {
  final Function callBack;

  const ChildWidget({Key key, this.callBack}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: FlatButton(
        child: Text('Press'),
        onPressed: () {
          var image = uploadImageMethod();
          callBack(image);
        },
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...