【发布时间】:2021-01-03 15:39:14
【问题描述】:
我有以下 FiltersScreen,其中包含 2 个过滤器和一个保存按钮。当用户切换过滤器并单击保存按钮时,我想将这些值传递给 CategoryMealsScreen。我怎样才能传递这些值?这两个屏幕之间没有导航,所以我不能使用 push 或 pushNamed 路由。
这是两个类:
class FiltersScreen extends StatefulWidget {
@override
_FilterScreenState createState() => _FilterScreenState();
}
class _FilterScreenState extends State<FiltersScreen> {
var _glutenFree = false;
var _lactoseFree = false;
Widget _buildSwitchListTile(String title, String subTitle, bool currentValue, Function updateValue){
return SwitchListTile(title:Text(title),
value:currentValue,
subtitle: Text(subTitle),
onChanged: updateValue
);
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Filter'),
actions:<Widget>[
IconButton(icon:Icon(Icons.save), onPressed: () { },),
],
),
drawer: MainDrawer(),
body: Column(children:<Widget>[
Container(
padding: EdgeInsets.all(20),
child:Text('Adjust your meal selection',
style:Theme.of(context).textTheme.title), ),
Expanded(
child:ListView(
children:<Widget>[
_buildSwitchListTile('Gluten-free',
'Only include gluten free meals',
_glutenFree,
(newValue){setState((){
_glutenFree = newValue;
},);
}),
_buildSwitchListTile('Lactose',
'Only include lactose free meals',
_lactoseFree,
(newValue){setState((){
_lactoseFree = newValue;
},);
})]
)
)
]));
}
}
这是应该接收值的类:
class CategoryMealsScreen extends StatefulWidget {
final String categoryId;
final String categoryTitle;
CategoryMealsScreen(this.categoryId, this.categoryTitle);
@override
_CategoryMealsScreenState createState() => _CategoryMealsScreenState();
}
class _CategoryMealsScreenState extends State<CategoryMealsScreen> {
@override
Widget build(BuildContext context) {
final categoryMeals = DUMMY_MEALS.where((meal) {
return meal.categories.contains(widget.categoryId);
}).toList();
return Scaffold(
appBar: AppBar(title: Text(widget.categoryTitle)),
body: ListView.builder(
itemBuilder: (ctx, index) {
return MealItem(
id:categoryMeals[index].id,
title: categoryMeals[index].title,
imageUrl: categoryMeals[index].imageUrl,
duration: categoryMeals[index].duration,
affordability: categoryMeals[index].affordability,
complexity: categoryMeals[index].complexity,
);
},
itemCount: categoryMeals.length,
),
);
}
}
已编辑
在CategoryMealsScreen 中,如何同时使用_glutenFree 和_lactoseFree 值?
这是我更新的代码:
CategoryMealsScreen
class CategoryMealsScreen extends StatefulWidget {
final String categoryId;
final String categoryTitle;
CategoryMealsScreen(this.categoryId, this.categoryTitle);
@override
_CategoryMealsScreenState createState() => _CategoryMealsScreenState();
}
class _CategoryMealsScreenState extends State<CategoryMealsScreen> {
@override
Widget build(BuildContext context) {
ValueListenable<bool> _glutenFree;
ValueListenable<bool> _lactoseFree;
return ValueListenableBuilder(
valueListenable: _glutenFree,
builder: (context, value, _) {
final categoryMeals = DUMMY_MEALS.where((meal) {
if (_glutenFree.value && !meal.isGlutenFree) {
return false;
}
if (_lactoseFree.value && !meal.isLactoseFree) {
return false;
}
return true;
}).toList();
//Every independent screen must have a scaffold
return Scaffold(
appBar: AppBar(title: Text(widget.categoryTitle)),
body: ListView.builder(
itemBuilder: (ctx, index) {
return MealItem(
id: categoryMeals[index].id,
title: categoryMeals[index].title,
imageUrl: categoryMeals[index].imageUrl,
duration: categoryMeals[index].duration,
affordability: categoryMeals[index].affordability,
complexity: categoryMeals[index].complexity,
);
},
itemCount: categoryMeals.length,
),
);
});
}
}
FiltersScreen
class FiltersScreen extends StatefulWidget {
@override
_FilterScreenState createState() => _FilterScreenState();
}
class _FilterScreenState extends State<FiltersScreen> {
ValueNotifier<bool> _glutenFree = new ValueNotifier(false);
ValueNotifier<bool> _lactoseFree = new ValueNotifier(false);
Widget _buildSwitchListTile(String title, String subTitle, ValueNotifier<bool> currentValue, Function updateValue){
return SwitchListTile(title:Text(title),
value:currentValue.value,
subtitle: Text(subTitle),
onChanged: updateValue
);
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Filter'),
actions:<Widget>[
IconButton(icon:Icon(Icons.save), onPressed: () { },),
],
),
drawer: MainDrawer(),
body: Column(children:<Widget>[
Container(
padding: EdgeInsets.all(20),
child:Text('Adjust your meal selection',
style:Theme.of(context).textTheme.title), ),
Expanded(
child:ListView(
children:<Widget>[
_buildSwitchListTile('Gluten-free',
'Only include gluten free meals',
_glutenFree,
(newValue){setState((){
_glutenFree.value = newValue; //setting the value
_glutenFree.notifyListeners(); //all the widget who is listening to this value, let them know the change
},);
}),
_buildSwitchListTile('Lactose',
'Only include lactose free meals',
_lactoseFree,
(newValue){setState((){
_lactoseFree = newValue;
_lactoseFree.notifyListeners();
},);
}),
]
)
)
]));
}
}
【问题讨论】:
-
是否有任何屏幕可以调用这两个类?
-
不,没有这样的屏幕。
标签: flutter