分离 类 时我无法保存我的数据

I cannot save my Data when separating classes

我尝试保存 CheckBox 和 RadioListTile 数据。我将 CheckBox 和 RadioList 分开为 Class 。这是我的代码,我尝试了很多但无法解决问题。

我已经使用你的代码重现了这个问题。有几个问题,但不用担心:

1- 你应该让你的 Child 小部件(MyCheckBoxMyRadio)无状态,因为它们的状态由父(HomePage)处理。

2- 在 home_page.dart 中:HomePage 调用 MyCheckBox 小部件,如下所示:

home_page.dart

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  TextEditingController _controller = TextEditingController();
  List<String> fruits = [];
  Helper myHelper = Helper();
  FutureServices future = FutureServices();
  Singers currentSinger = Singers.Ianis;
  @override
  initState() {
    super.initState();
    verileriOku1();
  }

  @override
  Widget build(BuildContext context) {
    print("build calıştı");
    return Scaffold(
        appBar: AppBar(title: Text("Storage App")),
        body: ListView(
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextFormField(
                controller: _controller,
                decoration: const InputDecoration(hintText: "İsim Giriniz"),
              ),
            ),
            MyRadio(),
            MyCheckBox(myValue: (value) {
              value = fruits;
              
            }),
            TextButton(
              onPressed: () {
                print(fruits);
                print(currentSinger);
              },
              child: Text("Yazdır"),
            ),
            TextButton(
                onPressed: () {
                  var object =
                      MyVariables(_controller.text, currentSinger, fruits);
                  myHelper.verileriKaydet(object);
                },
                child: Text("Kaydet")),
          ],
        ));
  }

  void verileriOku1() async {
    var info = await myHelper.verileriOku();

    setState(() {
      _controller.text = info.name;
      fruits = info.fruitList;
      currentSinger = info.singer;
    });
  }
}

正如我们所见,您没有正确分配水果。因此,一种可能的解决方案是:

MyCheckBox(myValue: (value) {
  fruits = value;        
}),

但在接下来的步骤中,我决定删除 Function。相反,您需要直接向 Child 小部件提供水果列表。

3- 在 my_check_box.dart 中:MyCheckBox 小部件需要 Function 才能与 HomePage 通信,如下所示:

my_check_box.dart

class MyCheckBox extends StatefulWidget {
  final Function myValue;
  MyCheckBox({Key? key, required this.myValue}) : super(key: key);

  @override
  State<MyCheckBox> createState() => _MyCheckBoxState();
}

所以您需要在这些小部件之间传递数据,并且您选择使用 Function 来完成。但是由于 ListDart 语言中是通过引用传递的,因此您可以使用 List 来传递值:

const MyCheckBox({
  Key? key,
  required this.savedFruits,
  required this.onChanged,
}) : super(key: key);

final List<String> savedFruits;
final void Function(bool? value, Meyveler meyve) onChanged;

使用 List 的另一个积极方面是现在我们可以正确检查这些水果是否是保存的水果:

my_check_box.dart

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

import '../models/enums.dart';

class MyCheckBox extends StatelessWidget {
  const MyCheckBox({
    Key? key,
    required this.savedFruits,
    required this.onChanged,
  }) : super(key: key);

  final List<String> savedFruits;
  final void Function(bool? value, Meyveler meyve) onChanged;

  @override
  Widget build(BuildContext context) => Column(
        children: [
          for (var meyve in Meyveler.values) check(meyve),
        ],
      );

  CheckboxListTile check(Meyveler meyve) => CheckboxListTile(
        title: Text(meyve.name),
        value: savedFruits.contains(describeEnum(meyve)),
        onChanged: (value) => onChanged(value, meyve),
      );
}

4- 当谈到 radio buttons 时,HomePageMyRadio 小部件之间没有任何联系。所以请看一下与此主题相关的以下解决方案:

my_radio.dart

import 'package:flutter/material.dart';

import '../models/enums.dart';

class MyRadio extends StatelessWidget {
  const MyRadio({
    Key? key,
    required this.currentSinger,
    required this.onChanged,
  }) : super(key: key);

  final Singers currentSinger;
  final void Function(Singers singer) onChanged;

  @override
  Widget build(BuildContext context) => Column(
        children: [
          for (var singer in Singers.values) _radio(singer),
        ],
      );

  RadioListTile<Singers> _radio(Singers singer) => RadioListTile(
        title: Text(singer.name),
        value: singer,
        groupValue: currentSinger,
        onChanged: (_) => onChanged(singer),
      );
}

您可以通过GitHub访问修改后的源代码。

如果您还有其他问题,请随时在评论中留言。