Изменить родительскую переменную и перестроить родительский виджет, когда дочерний виджет изменит Flutter - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть виджет экрана и пользовательский виджет. Я хочу изменить значение экранного виджета, когда нажата кнопка моего пользовательского виджета. Просто чтобы показать пример:

Это виджет MyScreen, который использует CustomWidget в качестве дочернего элемента:

import './widgets/my_custom_widget.dart';
class MyScreen extends StatefulWidget {

  @override
  _MyScreen createState() => _MyScreenState();
}

class _MyScreen extends State<MyScreen> {
 bool isChildButtonPressed = false;
  @override
  Widget build(BuildContext context) {
    return Container(
         child:MyCustomWidget());
    }
}

Это MyCustomWidget

class MyCustomWidget extends StatefulWidget {

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

class _MyCustomWidget extends State<MyCustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
        width:200,
        height:200,
         child: Row(children:[
                  FlatButton(child:Text("I am child button"),onPressed:(){
                     //what should I do here to change MyScreen isChildButtonPressed to true? 

                       }),
                  ]
             )
        );
    }
}

Код выше просто пример того, чего я хочу достичь, но в моем приложении у меня есть несколько дочерних виджетов с несколькими кнопками, и я хочу сохранить виджет в отдельном файле, но я хочу изменить некоторые переменные родительского виджета, когда кнопка дочернего виджета нажат.

Что я могу сделать, это объявить переменные родителя как глобальные переменные, а затем использовать ValueNotifier, но я не думаю, что это хороший способ решить эту проблему, поскольку мне нужны только эти переменные на одном экране, а не все приложение.

Я не думаю, что смогу использовать пакет Provider, потому что он перестраивает только дочерние виджеты, а не родительские.

Так что вы предлагаете?

Спасибо

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете создать файл в CustomWidget onFlatButtonPressed. В качестве поля будет использоваться функция обратного вызова или VoidCallBack, после чего вызывается функция при нажатии плоской кнопки в CustomWidget и определяется функция в вашем ** MyScreen *

Как это

class MyScreen extends StatefulWidget {
  @override
  _MyScreenState createState() => _MyScreenState();
}

class _MyScreenState extends State<MyScreen> {
  bool isChildButtonPressed = false;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: MyCustomWidget(
        onFlatButtonPressed: (){
          setState(() {
            //Write what you want to do here
          });
        },
      ),
    );
  }
}

class MyCustomWidget extends StatefulWidget {
  final VoidCallback onFlatButtonPressed;

  MyCustomWidget({@required this.onFlatButtonPressed});

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

class _MyCustomWidget extends State<MyCustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      height: 200,
      child: Row(
        children: [
          FlatButton(child: Text("I am child button"), onPressed: widget.onFlatButtonPressed),
        ],
      ),
    );
  }
}
...