Флаттер передает значение счетчика на другую страницу

#android #flutter #counter #pass-data

Вопрос:

Здравствуйте, ребята, я хочу передать данные счетчика на новый экран в flutter. Я уже пытался поместить данные в конструктор, но это не сработает. Это и есть код:

   int _counterb = 0;
 
 setState(() {
        Navigator.of(context).push(
            MaterialPageRoute(builder:
            (BuildContext context) =>
              Draw(_counterb: _counterb),
            ),
        );
      });
 

Итак, как я могу передать эти данные _counterb на вторую страницу?

Редактировать

Я решил эту проблему. Но теперь я сталкиваюсь с другим. Я хочу передать 12 значений. Но для этого нужны только двое. Как я могу передать более 2 позиционных аргументов?

Комментарии:

1. Вы можете передать любое количество аргументов в конструкторе. Просто объявите их в своем классе рисования

Ответ №1:

Я рекомендую использовать provider или getx для управления состоянием в приложении вместо передачи 12 аргументов на разные экраны;

если вы все еще хотите это сделать, вы можете отправить данные на второй экран через settings

например:

    Navigator.of(context).push(
            MaterialPageRoute(builder:
            (BuildContext context) =>
              Draw(),
              settings: RouteSettings(arguments: {'counterb': _counterb,},),
            ),
        );
 

и доступ к нему на экране Draw() через:

  @override
  void didChangeDependencies() {
    final routeArg =
        ModalRoute.of(context)!.settings.arguments as Map<dynamic, dynamic>;
    final counterb = routeArg['counterb'];
}
 

также функция setState() здесь не нужна

Ответ №2:

Вы пытались получить доступ к своей _counterb переменной на Draw странице?

Я предполагаю, что ничья-это StatefulWidget

 class Draw extends StatefulWidget {
  final int counter1, counter2, counter3; //Declare any number of variables you want
  const Draw({this.counter1, this.counter2, this.counter3});

  @override
  DrawState createState() => DrawState();
}

class DrawState extends State<Draw> {
  @override
  Widget build(BuildContext context) {
    return Text("${widget.counter1} ${widget.counter2} ${widget.counter3}");
  }
}
 

Ваша Navigator воля будет выглядеть так

  Navigator.of(context).push(
            MaterialPageRoute(builder:
            (BuildContext context) =>
              Draw(counter1: _counter1, counter2: _counter2, counter3: _counter3),
            ),
        );
 

Комментарии:

1. Да, я попробовал, и это сработало отлично.

2. Единственная проблема в том, что я хочу передать более одного значения…

3. Когда я добавляю третье значение, оно говорит: «Слишком много позиционных аргументов: 2 ожидаемых, но 3 найдено».

4. Хорошо понял, что это означает, что в классе Draw вы объявили только две переменные. Поэтому вам нужно объявить свою третью переменную в классе Draw, чтобы передать ее в конструктор