ошибка : Тип аргумента «Функция» не может быть присвоен типу параметра » Функция void()?»

#flutter #dart #navigation-drawer

Вопрос:

Я новичок в flutter, и я получаю ошибку:

 error : The argument type 'Function' can't be assigned to the parameter type 'void Function()'
 

Я создал приложение для приема пищи.

Я добавил простое Drawer() . Я получаю ошибку, когда открываю ящик.

 import 'package:flutter/material.dart';
import 'package:recipes/screens/filters_screen.dart';

class MainDrawer extends StatelessWidget {
  Widget buildListTile(String title, IconData icon, Function tapHandler) {
    return ListTile(
        leading: Icon(
          icon,
          size: 26,
        ),
        title: Text(
          title,
          style: TextStyle(
              fontFamily: 'RobotoCondensed',
              fontSize: 24,
              fontWeight: FontWeight.bold),
        ),
        onTap:tapHandler
    );
  }

  @override
  Widget build(BuildContext context) {
    return Drawer(
        child: Column(
      children: [
        Container(
          height: 120,
          width: double.infinity,
          padding: EdgeInsets.all(20),
          alignment: Alignment.centerLeft,
          color: Theme.of(context).accentColor,
          child: Text(
            'Cooking up!',
            style: TextStyle(
                fontWeight: FontWeight.w900,
                fontSize: 30,
                color: Theme.of(context).primaryColor),
          ),
        ),
        SizedBox(
          height: 20,
        ),
        buildListTile('Meals', Icons.restaurant,()  {
          Navigator.of(context).pushNamed('/');
        }),
        buildListTile('Filters', Icons.settings, ()  {
          Navigator.of(context).pushNamed(FiltersScreen.routeName);
        }),
      ],
    ));
  }
}
 

Ответ №1:

Можете ли вы попытаться указать тип tapHandler в своем buildListTile методе?

   Widget buildListTile(String title, IconData icon, void Function() tapHandler) {
/* ... The rest of your method */
}
 

Ответ №2:

Dart поддерживает сильные типы функций. Это означает, что в дополнение к типу Function вы также можете указать типы параметров и тип возвращаемого значения в своем типе функции. Например:

 String example(int i) => 'Hello $i';

var String Function(int) function = example;
 

Ошибка, которую вы получаете при переходе tapHandler , в ListTile.onTap основном говорит: «Мне нужна функция, которая не принимает параметров и возвращает void , но вы дали мне любую функцию».

Например, вы могли бы позвонить:

 buildListTile('example', Icons.add, (String s) => null)
 

что не void Function() соответствует ListTile требованиям.

Чтобы исправить это, измените buildListTile на:

 Widget buildListTile(String title, IconData icon, void Function() tapHandler) ...