#flutter #dart
Вопрос:
в этом файле у меня есть функция setFilters
, но мне нужно использовать эту функцию внутри экрана фильтра(еще один виджет с отслеживанием состояния), поэтому я передал ее в маршрут FiltersScreen(setFilters)
вот главная.дротик:
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Map<String, bool> _filters = {
'gluten': false,
'lactose': false,
'vegan': false,
'vegetarian': false,
};
void setFilters(Map<String, bool> _filterData) {
setState(() {
_filters = _filterData;
});
}
.
.
.
.
.
routes: {
TabsScreen.routeName: (context) => TabsScreen(),
CategoryMealScreen.routeName: (context) => CategoryMealScreen(),
MealDetailsScreen.routeName: (context) => MealDetailsScreen(),
FiltersScreen.routeName: (context) => FiltersScreen(setFilters),
},
вот второй файл.
Я получил функцию как x
, и мне нужно вызвать ее в кнопке значка. Я пытался Widget.x
, но ничего не вышло.
import 'package:flutter/material.dart';
import '../wedgits/main_drawer.dart';
class FiltersScreen extends StatefulWidget {
static const routeName = "filters";
final Function x;
FiltersScreen(this.x);
@override
_FiltersScreenState createState() => _FiltersScreenState();
}
class _FiltersScreenState extends State<FiltersScreen> {
bool _glutenFree = false;
bool _lactoseFree = false;
bool _viegan = false;
bool _vegetarian = false;
Widget buildSwitchListTile(
String title,
String subtitle,
bool currentvalue,
Function updateValue,
) {
return SwitchListTile(
title: Text(title),
subtitle: Text(subtitle),
value: currentvalue,
onChanged: updateValue);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Your Filters"),
actions: [
IconButton(
icon: Icon(Icons.save),
onPressed: () {} // here I want to call the function x
),
],
),
Комментарии:
1. Вы можете попробовать вызвать widget.x()
2. Я попробовал, но это не сработало
3. «Не сработало» не помогает диагностировать проблему. Что происходит? Обратите внимание , что, поскольку
widget.x
это вызовsetFilters
, и посколькуsetFilters
требуетсяMap<String, bool>
аргумент, вам нужно будет его предоставить. (Вы также должны объявитьFiltersScreen.x
какvoid Function(Map<String, bool>) x
, чтобы анализатор мог перехватывать ошибки типа.)4. Спасибо, Джеймсдлин, проблема была слишком глупой, я не знаю, как я ее пропустил. Я написал
Widget.x
правильноwidget.x
с маленькой буквы5. @DevonRay ты был прав. Спасибо
Ответ №1:
Вам нужно использовать onPressed вот так:
onPressed: () => widget.x()
Комментарии:
1. Оооо! Я понял это после часа попыток, я написал это с большой буквы
widget
правильно, а неWidget
так, как это работало без предварительных условий, таких какonPressed: () => widget.x
2. Отлично! Пожалуйста, примите это как правильный ответ.