Передача и вызов функции вне одного и того же файла

#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. Отлично! Пожалуйста, примите это как правильный ответ.