首页 > 解决方案 > 通过多个小部件从模态传递数据

问题描述

Flutter 的另一个新手。我真的认为这将是 2 分钟的工作,但实际上我在这里得到了堆栈。我需要传递“你好”数据

从模态小部件

class ToolModal extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('tools'),
        FlatButton(
          child: Text('save'),
          onPressed: () => Navigator.pop(context, 'Hello'),
        ),
      ],
    );
  }
}

通过 Bar 小部件

class Bar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BarItem(
      name: 'Option1',
      icon: Icons.category,
      onPressed: () {
        showModalBottomSheet(
          isScrollControlled: true,
          context: context,
          builder: (context) => ToolModal(),
        );
      },
    );
  }
}

到我的主屏幕

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Bar();
  }
}

我知道(我以为我知道)如何在屏幕之间传递数据,但模式和小部件之间真的让我失望。请问有人可以帮我吗?我真的为这个问题道歉,但我找不到答案

标签: flutterdart

解决方案


你很亲密。showModalBottomSheet返回一个Future。您可以通过以下方式捕获生成的“Hello”:

class Bar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BarItem(
      name: 'Option1',
      icon: Icons.category,
      onPressed: () async {
        String hello = await showModalBottomSheet(
          isScrollControlled: true,
          context: context,
          builder: (context) => ToolModal(),
        );
      },
    );
  }
}

您可以使用回调函数将数据传回主屏幕:

class Bar extends StatelessWidget {
  final Function(String) onHello;

  const Bar({Key key, this.onHello}): super(key: key);

  @override
  Widget build(BuildContext context) {
    return BarItem(
      name: 'Option1',
      icon: Icons.category,
      onPressed: () async {
        String hello = await showModalBottomSheet(
          isScrollControlled: true,
          context: context,
          builder: (context) => ToolModal(),
        );
        onHello(hello);
      },
    );
  }
}
class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Bar(onHello: (String hello) {
      print(hello);
    });
  }
}

推荐阅读