我构建了一个应用程序,我想创建一个页面,允许用户更改"showModalBottomSheet"小部件中的"CheckboxListTile"小部件的值. 在用户点击按钮之后,应该会出现"showModalBottomSheet"小部件.

以下是我的代码:

class showModalBottomSheetTester extends StatefulWidget {
  const showModalBottomSheetTester({super.key});

  @override
  State<showModalBottomSheetTester> createState() =>
      _showModalBottomSheetTesterState();
}

class _showModalBottomSheetTesterState
    extends State<showModalBottomSheetTester> {
  bool? _isChecked = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('showModalBottomSheetTester'),
      ),
      body: ElevatedButton(
          onPressed: () {
            showModalBottomSheet(
                context: context,
                builder: (BuildContext context) {
                  return SizedBox(
                    height: 500,
                    child: Column(
                      children: [
                        const Padding(
                          padding: EdgeInsets.only(top: 30.0),
                          child: Text('Head'),
                        ),
                        CheckboxListTile(
                            title: const Text('data'),
                            value: _isChecked,
                            activeColor: Colors.red,
                            checkColor: Colors.blue,
                            tileColor: Colors.green,
                            subtitle: const Text('data'),
                            controlAffinity: ListTileControlAffinity.leading,
                            tristate: true,
                            onChanged: (bool? newValue) {
                              setState(() {
                                _isChecked = newValue;
                              });
                            })
                      ],
                    ),
                  );
                });
          },
          child: const Text('press')),
    );
  }
}

这段代码的用户界面很棒,但当我单击复选框以更改值时,屏幕上没有显示任何更改.如何解决这个问题?

推荐答案

showModalSheet内,如果你拨打setState,它不会起作用.您需要在工作表中使用StatefulBuilder.

因此,将modalSheet的内容用StatefulBuilder括起来:

ElevatedButton(
          onPressed: () {
            showModalBottomSheet(
                context: context,
                builder: (BuildContext context) {
                  return StatefulBuilder(
                      builder: (BuildContext context, StateSetter setState) {
                    return SizedBox(
                      height: 500,

下面是一个完整的可运行代码片段:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Center(child: showModalBottomSheetTester()),
      ),
    );
  }
}

class showModalBottomSheetTester extends StatefulWidget {
  const showModalBottomSheetTester({super.key});

  @override
  State<showModalBottomSheetTester> createState() =>
      _showModalBottomSheetTesterState();
}

class _showModalBottomSheetTesterState
    extends State<showModalBottomSheetTester> {
  bool? _isChecked = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('showModalBottomSheetTester'),
      ),
      body: ElevatedButton(
          onPressed: () {
            showModalBottomSheet(
                context: context,
                builder: (BuildContext context) {
                  return StatefulBuilder(
                      builder: (BuildContext context, StateSetter setState) {
                    return SizedBox(
                      height: 500,
                      child: Column(
                        children: [
                          const Padding(
                            padding: EdgeInsets.only(top: 30.0),
                            child: Text('Head'),
                          ),
                          CheckboxListTile(
                              title: const Text('data'),
                              value: _isChecked,
                              activeColor: Colors.red,
                              checkColor: Colors.blue,
                              tileColor: Colors.green,
                              subtitle: const Text('data'),
                              controlAffinity: ListTileControlAffinity.leading,
                              tristate: true,
                              onChanged: (bool? newValue) {
                                setState(() {
                                  _isChecked = newValue;
                                });
                              })
                        ],
                      ),
                    );
                  });
                });
          },
          child: const Text('press')),
    );
  }
}

See also

Flutter相关问答推荐

为什么他们实例化类,然后丢弃该实例?

video_player在Android上返回401 Unauthorized with Bunny CDN

如何在用Ffltter成功登录后重定向下一页?

分页控制器在到达页面末尾之前或在初始化页面时对每个索引调用API

如何将WebViewWidget和WillPopScope结合起来

如何在Dart中允许正则表达式中有一个空格,但允许其他字符为1或更多?

创建仅定义导出的文件是否有意义?

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

切换 Firebase 项目后 Flutter FirebaseAuthException 'configuration-not-found'

转换函数上传文件上传Uint8List

我的第一个 flutter 项目出错,启动时为空值?

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

Flutter Bloc 使用 Cubit 监听流和emits 状态

如何在 flutter 中创建渐变按钮

如何在 Flutter 中使用简写 IF 禁用单选按钮?

Firebase Cloud Messaging (Flutter):订阅主题时出现错误消息

使用 Chaquopy 插件后 Gradle Sync 无法正常工作

Flutter_riverpod 安装时出现问题

Flutter Firebase 可以在真实设备上运行,而不是在 Android 模拟器上运行

如何在Flutter 的 initState 中初始化 Firestore 查询