Flutter 中使用 CheckboxListTile 和 List,无法选中,数据也不正常,请问是什么问题?

问题已解决。贴一下比较完整的代码:

class _MyHomePageState extends State<MyHomePage> {
  int _step = 0;
  // 应该写在这里
  List<Belief> believes = [];

  @override
  Widget build(BuildContext context) {
    var talkData = context.read<TalkDataModel>();
    final TextEditingController feelController = TextEditingController(text: talkData.feel);
    final TextEditingController goalController = TextEditingController(text: talkData.goals);
    final TextEditingController nameController = TextEditingController(text: talkData.name);
    // 不应该写在这里
    List<Belief> believes = [];

因为我把变量声明在 build() 里,导致失效。


请教大家一个问题,如图:

image.png

image.png

  1. 我使用 List 保存选中的结果
  2. 然后通过 enum 生成 checkbox list
  3. 到此一切正常
  4. 然后使用 onChanged 事件收集用户操作
  5. 但是实际上复选框无法选中(没有效果)
  6. print 的 List 里只有一条数据,即当前操作的数据

我觉得问题可能不太复杂,所以没有贴代码。请大家多多指教,谢谢。

阅读 3.5k
2 个回答

问题未复现。你还是贴一下完整代码吧。

image.png

以下是我的测试代码,运行在 https://dartpad.dev/dart 上:

import 'package:flutter/material.dart';

enum Belief {
  belief1,
  belief2,
  belief3,
  belief4
}

void main() => runApp(const CheckboxListTileApp());

class CheckboxListTileApp extends StatelessWidget {
  const CheckboxListTileApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(useMaterial3: true),
      home: const CheckboxListTileExample(),
    );
  }
}

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

  @override
  State<CheckboxListTileExample> createState() => _CheckboxListTileExampleState();
}

class _CheckboxListTileExampleState extends State<CheckboxListTileExample> {
  List<Belief> beliefs = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          const Text("Let's personalize what works for you. Which belief(s) resonate with you the most?"),
          for (var belief in Belief.values)
            CheckboxListTile(
              title: Text(belief.toString().split('.').last),
              value: beliefs.contains(belief),
              onChanged: (bool? value) {
                setState(() {
                  if (value!) {
                    beliefs.add(belief);
                  } else {
                    beliefs.remove(belief);
                  }
                  print(beliefs);
                });
              },
            )
        ]
      ),
    );
  }
}

问题已解决。贴一下比较完整的代码:

class _MyHomePageState extends State<MyHomePage> {
  int _step = 0;
  // 应该写在这里
  List<Belief> believes = [];

  @override
  Widget build(BuildContext context) {
    var talkData = context.read<TalkDataModel>();
    final TextEditingController feelController = TextEditingController(text: talkData.feel);
    final TextEditingController goalController = TextEditingController(text: talkData.goals);
    final TextEditingController nameController = TextEditingController(text: talkData.name);
    // 不应该写在这里
    List<Belief> believes = [];

因为我把变量声明在 build() 里,导致失效。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题