0

我如何将数据从showmodalbottomsheet上一页传递。下面是示例代码,我尝试过的是当我单击它时有一个按钮显示 modalbottomsheet,当我单击完成按钮时它应该将1值传递到上一页并且我setStateonTap按下时添加了但它仍然没有改变以前页面,除非我点击Flutter Hot Reload。如何解决这个问题?

class TestPage extends StatefulWidget {
  const TestPage({Key? key}) : super(key: key);

  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  String textResult = "";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text(textResult),
                TextButton(
                    onPressed: () {
                      showModalBottomSheet(
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.only(
                                topRight: Radius.circular(24.0),
                                topLeft: Radius.circular(24.0))),
                        context: context,
                        builder: (_) => StatefulBuilder(
                            builder: (BuildContext context, setState) {
                          return Container(
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Row(
                                    mainAxisAlignment:
                                        MainAxisAlignment.spaceBetween,
                                    children: [
                                      GestureDetector(
                                        onTap: () {
                                          setState(() {
                                            textResult = "1";
                                          });
                                          Navigator.pop(context);
                                        },
                                        child: Text(
                                          'Done',
                                          style: TextStyle(
                                              color: Colors.red,
                                              fontWeight: FontWeight.bold),
                                        ),
                                      ),
                                    ],
                                  ),
                                ),
                              ],
                            ),
                          );
                        }),
                      );
                    },
                    child: Text('Press'))
              ],
            ),
          ),
        ),
      ),
    );
  }
}
4

2 回答 2

1

尝试更改此行:

builder: (BuildContext context, setState) {

用这条线

builder: (BuildContext context, StateSetter setStateModal) {

说明:build (Scaffold及其内容) 中的外部小部件和内部的小部件showModalBottomSheet具有不同的setState( ). 当您需要更新该小部件的某些部分时,您必须确保调用外部的。这个想法是setState( )在你的showModalBottomSheet. 为了能够做到这一点,你可以给两个setState()不同的名字,这样你就知道你在叫哪一个:StateSetter setStateModal

于 2021-10-16T18:11:22.353 回答
1

@Canada2000 的回答还可以。我只是扩展它。内部
的使用或+... 是这些小部件与当前上下文树分离。StatefulBuildershowDialog()showModalBottomSheet()

在此处输入图像描述

我们StatefulBuilder喜欢在对话框上显示更改时使用。StatefulBuilder有自己的statebuilder: (BuildContext context, setState) 并且调用setState正在使用StatefulBuilder的 setstate。

现在假设您想要更改两个 UI,为此您只需将StatefulBuilder的状态重命名为类似于SBsetState@Canada2000 所说的 inside builder 。

  • 更新_TestPageState使用setState((){})
  • 要更新对话框 UI,请使用 StatefulBuilder 的状态,例如SBsetState((){})

如果您不想在对话框中显示任何更改,您可以简单地忽略 StatefulBuilder。

你的小部件

import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  const TestPage({Key? key}) : super(key: key);

  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  String textResult = "";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text("text Result ${textResult}"),
                TextButton(
                    onPressed: () {
                      showModalBottomSheet(
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.only(
                                topRight: Radius.circular(24.0),
                                topLeft: Radius.circular(24.0))),
                        context: context,
                        builder: (_) => StatefulBuilder(
                            builder: (BuildContext context, setStateBTS) {
                          return Container(
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Row(
                                    mainAxisAlignment:
                                        MainAxisAlignment.spaceBetween,
                                    children: [
                                      GestureDetector(
                                        onTap: () {
                                          setState(() {
                                            textResult = "1";
                                          });
                                          Navigator.pop(context);
                                        },
                                        child: Text(
                                          'Done',
                                          style: TextStyle(
                                              color: Colors.red,
                                              fontWeight: FontWeight.bold),
                                        ),
                                      ),
                                    ],
                                  ),
                                ),
                              ],
                            ),
                          );
                        }),
                      );
                    },
                    child: Text('Press'))
              ],
            ),
          ),
        ),
      ),
    );
  }
}


于 2021-10-16T18:42:37.080 回答