Используйте функцию async с RaisedButton onPressed () для передачи объекта на другой маршрут

Я хочу иметь возможность нажимать кнопку и переходить на другой экран, передавая объект в качестве аргумента. Объект создается с помощью функции getPlayer(), которая находится в другом файле дротика; следовательно, асинхронная функция. Всякий раз, когда я запускаю код, я получаю сообщение об ошибке:

Error: This expression has type 'void' and can't be used. onPressed: loadPlayerCard('nebula'),

Вот код:

    class _HomeState extends State<Home> {

  List<Player> players;

   void loadPlayerCard (String playerName) async {
    Player player = await getPlayer(playerName);
    players.add(player);

    Navigator.pushNamed(context, '/playerCard', arguments: player);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[900],
      appBar: AppBar(
        title: Text('Smash Tracker'),
        centerTitle: true,
        backgroundColor: Colors.grey[850],
        elevation: 0,
      ),
      body: Center(
        child: RaisedButton.icon(
            onPressed: loadPlayerCard('nebula'), //This is where the error message points to 
            icon: Icon(Icons.touch_app),
            label: Text('Nebula'),
        ),
      ),
    );
  }
}

Любая помощь приветствуется!

2 ответа

Решение

Оберните его скобками следующим образом

RaisedButton.icon(
  onPressed:() async { loadPlayerCard('nebula'); }, // Fix for the issue
  icon: Icon(Icons.touch_app),
  label: Text('Nebula'),
),

Вы можете просто использовать Inline Arrow Function следующим образом.лексические замыкания

      RaisedButton.icon(
    onPressed: () => loadPlayerCard('nebula'), // Solved 
    icon: Icon(Icons.touch_app),
    label: Text('Nebula'),
),
Другие вопросы по тегам