Flutter 将数据从子窗口小部件传递到父窗口小部件

Flutter 将数据从子窗口小部件传递到父窗口小部件,flutter,dart,Flutter,Dart,我有一个仪表板小部件,其主体如下: 我想将数据从子部件DashboardGrid(在代码块末尾进行检查)传递到这个父部件。我该怎么做 body:Column( 儿童:[ 大小盒子( 身高:20, ), 填充物( 填充:仅限边设置(左:16,右:16), 孩子:排( mainAxisAlignment:mainAxisAlignment.spaceBetween, 儿童:[ 纵队( crossAxisAlignment:crossAxisAlignment.start, 儿童:[ 正文( “类别”

我有一个仪表板小部件,其主体如下:

我想将数据从子部件DashboardGrid(在代码块末尾进行检查)传递到这个父部件。我该怎么做

body:Column(
儿童:[
大小盒子(
身高:20,
),
填充物(
填充:仅限边设置(左:16,右:16),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
纵队(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
正文(
“类别”,
样式:TextStyle(
颜色:颜色,白色,
尺寸:20,
fontWeight:fontWeight.bold),
],
),
图标按钮(
对齐:alignment.topCenter,
图标:新图标(Icons.search,颜色:Theme.of(context.hintColor,),
按下:(){},
)
],
),
),
大小盒子(
身高:40,
),
仪表板网格(),
])
带有回调

在仪表板网格中创建一个函数


class DashboardGrid extends StatelessWidget {

final Function(String) callback;

DashboardGrid({this.callback});

....


然后在列中,您将使用函数实例化它

[
...,
DashboardGrid(callback:(String value)=>print(value));
]
void passTheData(String data) => callback(data);
当您想在仪表板网格中传递数据时,只需调用函数

[
...,
DashboardGrid(callback:(String value)=>print(value));
]
void passTheData(String data) => callback(data);
示例是使用
String
,但您可以通过回调传递任何数据。

在仪表板网格中创建一个函数


class DashboardGrid extends StatelessWidget {

final Function(String) callback;

DashboardGrid({this.callback});

....


然后在列中,您将使用函数实例化它

[
...,
DashboardGrid(callback:(String value)=>print(value));
]
void passTheData(String data) => callback(data);
当您想在仪表板网格中传递数据时,只需调用函数

[
...,
DashboardGrid(callback:(String value)=>print(value));
]
void passTheData(String data) => callback(data);

示例是使用
String
,但您可以传递任何数据。

如果您的子小部件位于同一个小部件树下,您可以利用
通知来冒泡数据

首先,为您需要的内容创建通知。您可以创建一个通知,也可以创建一个包含多个具体通知的抽象通知。对于本例,我假设您希望处理不同的通知

abstract class MyNotification extends Notification {}

class SomethingHappened extends MyNotification {}

class NothingHappened extends MyNotification {}
然后,您可以在父窗口小部件中处理该类型的所有通知:

class ParentWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NotificationListener<MyNotification>(
      onNotification: (notification) {
        // Handle your notification
        return true;
      },
      child: Container(),
    );
  }
}
类ParentWidget扩展了无状态widget{
@凌驾
小部件构建(构建上下文){
返回通知侦听器(
通知:(通知){
//处理您的通知
返回true;
},
子级:容器(),
);
}
}
或者选择单个的:

class ParentWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NotificationListener<MyNotification>(
      onNotification: (notification) {
        if(notification is SomethingHappened){
          // Handle 
        } else if(notification is NothingHappened){
          // Handle
        }
        return true;
      },
      child: Container(),
    );
  }
类ParentWidget扩展了无状态widget{
@凌驾
小部件构建(构建上下文){
返回通知侦听器(
通知:(通知){
如果(通知发生了什么事){
//处理
}否则,如果(通知不出现){
//处理
}
返回true;
},
子级:容器(),
);
}

要从子小部件发出通知,只需调用
T().dispatch(context)
,其中
T
是您的
通知类型。例如,
somethingOccessed().dispatch(context)
。就是这样。

如果您的子小部件位于同一个小部件树下,您可以利用
通知来冒泡数据

首先,根据需要创建通知。您可以创建一个通知,也可以创建一个包含多个具体通知的抽象通知。在本例中,我假设您要处理不同的通知

abstract class MyNotification extends Notification {}

class SomethingHappened extends MyNotification {}

class NothingHappened extends MyNotification {}
然后,您可以在父窗口小部件中处理该类型的所有通知:

class ParentWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NotificationListener<MyNotification>(
      onNotification: (notification) {
        // Handle your notification
        return true;
      },
      child: Container(),
    );
  }
}
类ParentWidget扩展了无状态widget{
@凌驾
小部件构建(构建上下文){
返回通知侦听器(
通知:(通知){
//处理您的通知
返回true;
},
子级:容器(),
);
}
}
或者选择单个的:

class ParentWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NotificationListener<MyNotification>(
      onNotification: (notification) {
        if(notification is SomethingHappened){
          // Handle 
        } else if(notification is NothingHappened){
          // Handle
        }
        return true;
      },
      child: Container(),
    );
  }
类ParentWidget扩展了无状态widget{
@凌驾
小部件构建(构建上下文){
返回通知侦听器(
通知:(通知){
如果(通知发生了什么事){
//处理
}否则,如果(通知不出现){
//处理
}
返回true;
},
子级:容器(),
);
}

要从子小部件发出通知,只需调用
T().dispatch(context)
,其中
T
是您的
通知类型。例如,
somethingOccessed().dispatch(context);
。就是这样。

要解决这个问题,有两种方法。第一种方法是创建GlobalKey()并将其作为参数传递给子窗口小部件。第二种方法是为父状态创建一个全局变量,并在子状态中使用它。

要解决这个问题,有两种方法。第一种方法是创建一个GlobalKey()第二种方法是为父状态创建一个全局变量,并在子状态中使用它。

只需将函数作为参数传递给DashboardGrid()从父级,然后通过传递要传递的所需数据来调用该函数。由于该函数是在父窗口小部件类中定义的,因此您可以使用该函数中的参数来计算数据,只需将函数作为参数传递给DashboardGrid()从父窗口,然后通过传递所需的数据来调用该函数。由于该函数是在父窗口小部件类中定义的,因此可以使用该函数中的