分离 类 时我无法保存我的数据
I cannot save my Data when separating classes
我尝试保存 CheckBox 和 RadioListTile 数据。我将 CheckBox 和 RadioList 分开为 Class 。这是我的代码,我尝试了很多但无法解决问题。
我已经使用你的代码重现了这个问题。有几个问题,但不用担心:
1- 你应该让你的 Child
小部件(MyCheckBox
,MyRadio
)无状态,因为它们的状态由父(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
来完成。但是由于 List
在 Dart
语言中是通过引用传递的,因此您可以使用 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
时,HomePage
和 MyRadio
小部件之间没有任何联系。所以请看一下与此主题相关的以下解决方案:
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访问修改后的源代码。
如果您还有其他问题,请随时在评论中留言。
我尝试保存 CheckBox 和 RadioListTile 数据。我将 CheckBox 和 RadioList 分开为 Class 。这是我的代码,我尝试了很多但无法解决问题。
我已经使用你的代码重现了这个问题。有几个问题,但不用担心:
1- 你应该让你的 Child
小部件(MyCheckBox
,MyRadio
)无状态,因为它们的状态由父(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
来完成。但是由于 List
在 Dart
语言中是通过引用传递的,因此您可以使用 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
时,HomePage
和 MyRadio
小部件之间没有任何联系。所以请看一下与此主题相关的以下解决方案:
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访问修改后的源代码。
如果您还有其他问题,请随时在评论中留言。