Я как бы плохо знаком с флаттером и пытаюсь получить две кнопки на своей странице и заставить их отправлять пользователя на разные страницы моего приложения. Прямо сейчас у меня есть этот код для моих кнопок, но чтобы он работал, я просто изменяю последнюю часть кода с SearchPage () на ScanPage (), и это кажется неэффективным. Можно ли как-то передать страницы в качестве аргументов для виджетов кнопок?

// Button for scanPage
Widget _buttonScan(String text, Color splashColor, Color highlightColor,
    Color fillColor, Color textColor) {
  return RaisedButton(
    highlightElevation: 0.0,
    splashColor: splashColor,
    highlightColor: highlightColor,
    elevation: 0.0,
    color: fillColor,
    shape: RoundedRectangleBorder(
        borderRadius: new BorderRadius.circular(30.0)),
    child: Text(
      text,
      style: TextStyle(
          fontWeight: FontWeight.bold, color: textColor, fontSize: 20),
    ),
    onPressed: () {
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => ScanPage()),
      );
    },
  );
}

// Button for searchPage
Widget _buttonSearch(String text, Color splashColor, Color highlightColor,
    Color fillColor, Color textColor) {
  return RaisedButton(
    highlightElevation: 0.0,
    splashColor: splashColor,
    highlightColor: highlightColor,
    elevation: 0.0,
    color: fillColor,
    shape: RoundedRectangleBorder(
        borderRadius: new BorderRadius.circular(30.0)),
    child: Text(
      text,
      style: TextStyle(
          fontWeight: FontWeight.bold, color: textColor, fontSize: 20),
    ),
    onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SearchPage()),
            );
    },
  );
}
1
Khal 16 Апр 2020 в 17:43

2 ответа

Лучший ответ

Вы можете передать функцию в качестве аргумента вашему виджету, который позаботится о направлении навигации. В вашем случае, либо перейдите к scanPage или searchPage, например так:

Widget _buttonScan(String text, Color splashColor, Color highlightColor,
Color fillColor, Color textColor, Widget Function() choosePage) {
return RaisedButton(
highlightElevation: 0.0,
splashColor: splashColor,
highlightColor: highlightColor,
elevation: 0.0,
color: fillColor,
shape: RoundedRectangleBorder(
    borderRadius: new BorderRadius.circular(30.0)),
child: Text(
  text,
  style: TextStyle(
      fontWeight: FontWeight.bold, color: textColor, fontSize: 20),
),
onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => choosePage()),
  );
},
);
}

И когда ты это называешь:

_buttonScan(...,() => ScanPage ()) //To go to ScanPage
_buttonScan(...,() => SearchPage()) //To go to SearchPage
1
Mohamad Hammoud 16 Апр 2020 в 15:47

Для передачи аргументов вам нужно использовать именованные маршруты из Navigator, например:

Navigator.pushNamed(
  context,
  ExtractArgumentsScreen.routeName,
  arguments: ScreenArguments(
    'Extract Arguments Screen',
    'This message is extracted in the build method.',
  ),
);

Смотрите официальную документацию

0
F Perroch 16 Апр 2020 в 14:59