我已经创建了可重用的SwitchListTile,每当我想使用任何东西时,我都会简单地调用它们。例如,我有一个像这样的自定义SwitchListTile:
import 'package:flutter/material.dart';
class FitterItem extends StatefulWidget {
FitterItem(
{super.key,
required this.fitterValue,
required this.fitterTittle,
required this.fitterSubTit,
required this.onChange});
bool fitterValue;
final String fitterTittle;
final String fitterSubTit;
final void Function(bool newValue) onChange;
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _FitterItemState();
}
}
class _FitterItemState extends State<FitterItem> {
@override
Widget build(context) {
// TODO: implement build
return SwitchListTile(
value: widget.fitterValue,
onChanged: (newValue) {
setState(() {
widget.fitterValue = newValue;
});
},
title: Text(
widget.fitterTittle,
style: Theme.of(context)
.textTheme
.titleLarge!
.copyWith(color: Theme.of(context).colorScheme.primaryContainer),
),
subtitle: Text(
widget.fitterSubTit,
style: Theme.of(context)
.textTheme
.labelLarge!
.copyWith(color: Theme.of(context).colorScheme.primary),
),
);
}
}
字符串
我有一个像下面这样的父类:
import 'package:flutter/material.dart';
import 'package:meals/widgets/fitter_item.dart';
enum Fitter {
GlutenFree,
LactoseFree,
Vegan,
Vegetarian,
}
class FitterScreen extends StatefulWidget {
const FitterScreen({super.key});
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _FitterScreenState();
}
}
class _FitterScreenState extends State<FitterScreen> {
@override
Widget build(context) {
var _glutenFitter = false;
var _lactoseFitter = false;
var _vegeterianFitter = false;
var _veganFitter = false;
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: const Text("Fitter"),
),
body: WillPopScope(
onWillPop: () async {
Navigator.of(context).pop({
Fitter.GlutenFree: _glutenFitter,
Fitter.LactoseFree: _lactoseFitter,
Fitter.Vegan: _veganFitter,
Fitter.Vegetarian: _vegeterianFitter,
});
return false;
},
child: Column(
children: [
FitterItem(
fitterValue: _glutenFitter,
onChange: (bool newValue) {
setState(() {
_glutenFitter = newValue;
});
},
fitterTittle: "Gluten free",
fitterSubTit: "Only include Gluten free meals"),
const SizedBox(
height: 5,
),
FitterItem(
fitterValue: _lactoseFitter,
onChange: (newValue) {
setState(() {
_lactoseFitter = newValue;
});
},
fitterTittle: "Lactose free",
fitterSubTit: "Only include Lactose free meals"),
const SizedBox(
height: 5,
),
FitterItem(
fitterValue: _veganFitter,
onChange: (newValue) {
setState(() {
_veganFitter = newValue;
});
},
fitterTittle: "Vegan free",
fitterSubTit: "Only include Vegan free meals"),
const SizedBox(
height: 5,
),
FitterItem(
fitterValue: _vegeterianFitter,
onChange: (newValue) {
setState(() {
_vegeterianFitter = newValue;
});
},
fitterTittle: "Vegeterian free",
fitterSubTit: "Only include Vegeterian free meals"),
],
),
),
);
}
}
型
但是我不能在Parent类上使用Updated值。它将Intilze值作为false。自定义SwitchListTile很好地改变了他的状态。
WillPopScope(
onWillPop: () async {
Navigator.of(context).pop({
Fitter.GlutenFree: _glutenFitter,
Fitter.LactoseFree: _lactoseFitter,
Fitter.Vegan: _veganFitter,
Fitter.Vegetarian: _vegeterianFitter,
});
return false;
},
型
1条答案
按热度按时间gajydyqb1#
问题是在子
FitterItem
小部件的状态中设置值,以及使var
低于FitterScreen
的build
方法,这在每次构建时将它们设置为false。FitterItem
可以是StatelessWidget
,SwitchListTile
的onChanged
方法应该接受从父代传递的函数,因此它可以在父代中运行该函数。字符串
1.将
FitterScreen
中的变数移至建置方法上方。型
完整代码
型