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

时间:2020-07-24 09:59:18

标签: flutter dart

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

我想将数据从子窗口小部件DashboardGrid(在代码块的末尾检查)传递到此父窗口小部件。我该怎么办?

    body: Column(
      children: <Widget>[
      SizedBox(
      height: 20,
    ),
        Padding(
          padding: EdgeInsets.only(left: 16, right: 16),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(
                    "Categories",
                    style:  TextStyle(
                            color: Colors.white,
                            fontSize: 20,
                            fontWeight: FontWeight.bold)),
     
                ],
              ),
              IconButton(
                alignment: Alignment.topCenter,
                icon: new Icon(Icons.search, color: Theme.of(context).hintColor,),
                onPressed: () {},
              )
            ],
          ),
        ),
        SizedBox(
          height: 40,
        ),
DashboardGrid(),
])

3 个答案:

答案 0 :(得分:0)

带有回调。

DashboardGrid内创建一个函数


class DashboardGrid extends StatelessWidget {

final Function(String) callback;

DashboardGrid({this.callback});

....


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

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

当您想在DashboardGrid内部传递数据时,只需调用函数

void passTheData(String data) => callback(data);

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

答案 1 :(得分:0)

如果您的子小部件位于同一小部件​​树下,则可以利用4来填充数据。

首先,根据需要创建通知。您可以创建一个通知,也可以创建包含多个具体通知的摘要Notification。对于此示例,我假设您要处理其他通知。

Notification

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

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(),
    );
  }
}

要从子窗口小部件发出通知,只需调用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(), ); } ,其中T().dispatch(context)是您的T类型。例如,Notification。就是这样。

答案 2 :(得分:0)

要解决此问题,有两种方法。第一种方法是创建GlobalKey(https://docs.flutter.io/flutter/widgets/GlobalKey-class.html)并将其作为参数传递给子窗口小部件。第二种方法是为父状态创建一个全局变量,并在子状态中使用它。