如何从 Flutter 中的子小部件调用父小部件功能

Posted

技术标签:

【中文标题】如何从 Flutter 中的子小部件调用父小部件功能【英文标题】:How to call parent widget function from child widget in Flutter 【发布时间】:2021-05-04 04:38:10 【问题描述】:

我有一个父 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】:

    在您的子小部件中创建一个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",
             ),
          ),
        );
      
    
    

    将函数goToPreviousItem作为参数从父小部件传递给子小部件。

    Child(function: goToPreviousItem);
    

    在子窗口小部件中使用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",
        ),
      ),
    );
  

【讨论】:

以上是关于如何从 Flutter 中的子小部件调用父小部件功能的主要内容,如果未能解决你的问题,请参考以下文章

如何从子小部件调用父小部件中的函数 |扑

在子小部件中,如何在 kivy 中获取父小部件的实例

如何在 Flutter 中正确重用 Provider

如何布局 GridView.count 以便小部件从 Flutter 中的父小部件顶部开始构建?

如何更轻松地实现一个 Flutter 布局?

如何在颤动中从父小部件调用子小部件的initState()方法