Как отправлять и получать аргументы между представлениями во флаттере - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь отправить данные со страницы на другую в flutter проекте, перепробовал все методы, которые я нашел в другом вопросе, но все не удалось, вот мой код:

Первая страница:

Navigator.pushNamed(context, '/line_details', arguments: {'line':line,});

Вторая страница:

class _LineDetailsState extends State<LineDetails> {

  Map data = {};

  @override
  Widget build(BuildContext context) {
    data  = ModalRoute.of(context).settings.arguments;
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.deepPurple,
        title: Text("$data"),
      ),
    );
  }
}

note : line - это пользовательский объект, созданный.

ошибка : всегда возвращает ноль, даже при попытке отправить одну строку как {"test": "test string"} тоже возвращает ноль

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

ваш пример работает нормально

маршрут в MaterialApp

routes: { "/line_details": (context) => LineDetails(), },

Pu sh на FlatButton:

onPressed: () => Navigator.pushNamed(context, '/line_details', arguments: {'line':'test',}),

class LineDetails

class LineDetails extends StatefulWidget {

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

class _LineDetailsState extends State<LineDetails> {

  Map data = {};

  @override
  Widget build(BuildContext context) {
    data  = ModalRoute.of(context).settings.arguments;

    print(data);
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.deepPurple,
        title: Text("$data"),
      ),
    );
  }

}

с GestureDetector также работает

new GestureDetector(
            onTap: () => Navigator.pushNamed(context, '/line_details', arguments: {'line':'test',}),
            child: new Container(child: new Text("GestureDetector"),),
          ),
0 голосов
/ 14 апреля 2020

Ваш пример выглядит правильно, еще одна вещь, которую вы можете попробовать, это привести ваш аргумент, как показано ниже, который помогает дротику для раскола. Обратите внимание, это не связано с тем, что вы получаете ноль

    class LineDetails extends StatefulWidget {

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

class _LineDetailsState extends State<LineDetails> {

  Map data = {};

  @override
  Widget build(BuildContext context) {
    data  = ModalRoute.of(context).settings.arguments as Map<String,object>;

    print(data);
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.deepPurple,
        title: Text("$data"),
      ),
    );
  }

}
0 голосов
/ 14 апреля 2020

попробуйте это:

Navigator.push(
    context,
    LineDetailsState(
        builder: (context) => LineDetailsState(
              line: line
            )))

и

class LineDetailsState extends StatefulWidget {
  LineDetailsState(this.line);

  Line line;

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

class _LineDetailsState extends State<LineDetails> {

  Map data = {};

  @override
  Widget build(BuildContext context) {
    data  = ModalRoute.of(context).settings.arguments;
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.deepPurple,
        title: Text("$data"),
      ),
    );
  }
}

вместо «Линия» замените его именем вашего пользовательского объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...