首页 > 解决方案 > 如何从颤动的模态中将变量返回到小部件?

问题描述

我有一个带有列表框的小部件,单击一个项目会打开一个窗口进行编辑。在其中,我可以更改 2 个字段,均为 DateTime 类型。

我不明白如何将这些变量从模式窗口返回到主小部件,我会很高兴得到任何帮助

在模态中,我有两个用于编辑的 TextEdit 控制器:

TextEditingController _comeInController = TextEditingController();
TextEditingController _goOutController = TextEditingController();

我将此变量返回到主小部件并发送到服务器

我的模态:

showMaterialModalBottomSheet(
       expand: false,
       context: context,
       builder: (context, scrollController) =>
                           Container(
                                    height: 400,
                                    child: RedactTimesheeft(
                                      comeIN: DateTime.parse(
                                          staffTimeList.parseComeIn),
                                      goOut: staffTimeList.parseGoOut != null
                                          ? DateTime.parse(
                                              staffTimeList.parseGoOut)
                                          : null,
                                    ),
                                  ),
                                )

标签: flutterdart

解决方案


如果您想在 ModalBottomSheet 中键入文本并在底层小部件中获取它,只需在两者中使用相同的 TextEditingController,在主小部件中初始化和处置它。

这是一个工作示例:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: MyApp(),
    ),
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TextEditingController _controller = TextEditingController();

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          RaisedButton(
            onPressed: () => showModalBottomSheet(
                isScrollControlled: true,
                context: context,
                builder: (BuildContext context) {
                  return Material(
                    child: Padding(
                      padding: MediaQuery.of(context).viewInsets,
                      child: TextField(
                        controller: _controller,
                      ),
                    ),
                  );
                }).whenComplete(() => setState(() {})),
            child: Text('Click to enter text'),
          ),
          Text(_controller.text == '' ? 'No text entered yet' : _controller.text),
        ],
      ),
    );
  }
}

推荐阅读