Как вызвать родительскую функцию виджета из дочернего виджета в Flutter

#flutter #dart #flutter-layout #flutter-web

#flutter #дротик #flutter-layout #flutter-web

Вопрос:

У меня есть родительский StatefulWidget и дочерний StatefulWidget. Я хочу вызвать функцию родительского виджета, то goToPreviousItem есть из дочернего виджета.

Родительский класс

 class Parent extends StatefulWidget {
 @override
 _ParentState createState() => _ParentState();
 }

class _ParentState extends State<Parent> {
 String item = 0;
 @override
 Widget build(BuildContext context) {
   return ChildClass();
 }


goToPreviousItem(value){
 setState(() {item = value});
 }
}
 

Дочерний класс

 class Child extends StatefulWidget {
 @override
 _ChildState createState() => _ChildState();
 }

class _ChildState extends State<Child> {
 @override
 Widget build(BuildContext context) {
   return Container(
  child: FlatButton(
    color: Color(0XFFEFEFEF),
    textColor: primaryColor,
    disabledColor: Colors.grey,
    disabledTextColor: Colors.black,
    padding: EdgeInsets.symmetric(
        vertical: 15.0, horizontal: 10.0),
    onPressed: () => goToPreviousItem(2),
    child: Text(
      "Update",
    ),
  ),
);
   }
 }
 

Как я могу это сделать?

Ответ №1:

  1. Создайте Function параметр типа внутри вашего дочернего виджета.
     class Child extends StatefulWidget {
    
     Function function;
     Child({this.function});
    
     @override
    _ChildState createState() => _ChildState();
    }
    
    class _ChildState extends State<Child> {
    @override
    Widget build(BuildContext context) {
     return Container(
    child: FlatButton(
     color: Color(0XFFEFEFEF),
     textColor: primaryColor,
     disabledColor: Colors.grey,
     disabledTextColor: Colors.black,
     padding: EdgeInsets.symmetric(
         vertical: 15.0, horizontal: 10.0),
     onPressed: () => widget.function(2),
     child: Text(
       "Update",
             ),
          ),
        );
      }
    }
     
  2. Передайте функцию goToPreviousItem в качестве параметра из родительского виджета в дочерний виджет.
     Child(function: goToPreviousItem);
     
  3. Получите доступ к своей функции, используя widget.function(2) внутри дочернего виджета.

Ответ №2:

 typedef parentFunctionCallback = void Function(String value);

class Parent extends StatefulWidget {
  @override
  _ParentState createState() => _ParentState();
}

class _ParentState extends State<Parent> {
  String item = 'data';
  
  @override
  Widget build(BuildContext context) {
    return ChildClass(goToPreviousItem);
  }
  
  goToPreviousItem(String value){
    setState(() {item = value;});
  }
}

class ChildClass extends StatefulWidget {
  const ChildClass(this.parentfunc);
  
  /// ToDo
  final parentFunctionCallback parentfunc; 
  
  @override
  _ChildState createState() => _ChildState();
}

class _ChildState extends State<ChildClass> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: FlatButton(
        color: Color(0XFFEFEFEF),
        textColor: primaryColor,
        disabledColor: Colors.grey,
        disabledTextColor: Colors.black,
        padding: EdgeInsets.symmetric(
            vertical: 15.0, horizontal: 10.0),
        onPressed: () => widget.parentfunc('mail'),
        child: Text(
          "Update",
        ),
      ),
    );
  }
}