Как проверить название вызывающего маршрута во Флаттере? - PullRequest
0 голосов
/ 26 апреля 2020

Я разрабатываю приложение, в котором одна и та же страница A вызывается с двух разных страниц B и C. Страница B передает объект, а страница C передает список A. Я хочу проверить, вызывается ли A из B или C, а также управлять различными типами аргументов, передаваемых с экрана B и C? Это так запутанно. Я застрял

class A extends StatefulWidget {
  final List<Exercises> data;

  A({
    Key key,
    @required this.data,
  }) : super(key: key);

  @override
  _A createState() => _B();
}

со страницы B

onTap: () {
           Navigator.pushNamed(context,'/ExerciseScreen',
                              arguments: {text:'abcd',
                                          description:'I am description'});
 },

со страницы C

List<Class> data;  //its already filled

Navigator.pushNamed(
              context, '/ExerciseScreen',arguments: data
          );

Если вы хотите, я тоже могу прикрепить файл роутера

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Всегда передавать данные в виде динамического c значения Map

arguments = {'dataFromB':{text:'abcd',description:'I am description'}}

arguments = {'dataFromC': dataList}

в A просто проверяйте данные, подобные этим

arguments.contains('dataFromB') //you know its called from B

arguments.contains('dataFromC') //you know its called from C

после доступа к данным с карты для обработки

1 голос
/ 26 апреля 2020

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

  1. Если вы заботитесь о данных больше, чем тот, кто вызвал класс A, тогда используйте два разных аргумента в классе A, один для Object и один для List. Если объект не равен нулю, то работает с объектом, а если список не равен нулю, тогда работайте со списком.

  2. Если вам небезразлично, кто вызвал класс A, тогда просто используйте другой аргумент в A это будет источником. Когда B вызывает A, передайте source как b, а если C вызывает A, тогда передайте source как c

Примечание : вы можете использовать оба решения вместе.

PS : Если бы вы могли подробно объяснить, что такое A, B и C, тогда я могу предложить лучшее архитектура.

...