Данные, передаваемые в виджет Stateful Flutter с помощью Navigator.pushNamed (), равны нулю.

Используя Flutter, я пытаюсь передать данные через конструктор на новый экран.

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

Данные также имеют тип int, если это имеет значение.

Именованная навигация по маршруту устроена так:

void main() => runApp(Main());

class Main extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: PreLoadScreen.id,
      //initialRoute: TemporaryScreen.id,
      routes: {
        TemporaryScreen.id: (context) => TemporaryScreen(),
        InfoScreen.id: (context) => InfoScreen(),
        PreLoadScreen.id: (context) => PreLoadScreen(),
        StatsScreen.id: (context) => StatsScreen(),
        RideScreen.id: (context) => RideScreen(),
        AudioScreen.id: (context) => AudioScreen(),
      },
    );
  }
}

Экран, на который я передаю данные, имеет следующий код конструктора:

class StatsScreen extends StatefulWidget {
  static const String id = 'stats_screen';
  int tableID; // current shift table ID being passed in from super

  // Constructor required for having data passed in
  StatsScreen({Key key, @required this.tableID}) : super(key: key);

  @override
  _StatsScreenState createState() {
    print('statsscreen DEBUG: $tableID'); // <-- this shows the data passed was NULL! :(
    return _StatsScreenState();
  }
}

Экран, из которого я передаю данные, содержит следующий код:

void _checkShiftStatus() async {
    bool userClockedIn = await ShiftManager().isUserClockedIn();

    int tableName = await ShiftManager().getActiveRideTableName();
    print('preload DEBUG: tablename: $tableName'); // <-- this verifies the data is NOT null here.

    if (userClockedIn) {
      Navigator.pushNamed(context, StatsScreen.id,
          arguments: {'tableID': tableName}); // <--- something is wrong here, presumably
    } else {
      shouldDisplayStartShift = !userClockedIn;
      showProgressSpinner = false;
    }
  }

Я пробовал изменить подозрительную строку на:

Navigator.pushNamed(context, StatsScreen.id,
          arguments: tableName); 

а также...

Navigator.pushNamed(context, StatsScreen.id,
          arguments: {tableName}); 

Но получите тот же результат на целевом экране (переданные данные равны нулю). Это что-то вроде бейсбола ... тесто - это начальный экран ... а ловушка - это экран, к которому мы переходим. Мяч - это данные. За исключением моего случая, тесто похоже на Сэмми Соса, и мяч находится где-то вне парка ... что отлично для Детёнышей, но не для меня.

Я также пробовал поиск в Google, документы, stackoverflow (даже

person Nerdy Bunz    schedule 22.02.2020    source источник
comment
эй, а вы пробовали использовать Navigator.push ()?   -  person Henok    schedule 22.02.2020
comment
Нет, я и я не хотим. Я бы хотел, чтобы на вопрос ответили как есть. Однако, спасибо.   -  person Nerdy Bunz    schedule 22.02.2020
comment
Это просто для отладки, если бы это сработало, мы могли бы понять проблему.   -  person Henok    schedule 22.02.2020


Ответы (1)


Вы должны получить доступ к данным с помощью ModalRoute.

class Delete2 extends StatefulWidget {
  Delete2({Key key}) : super(key: key);

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

class _Delete2State extends State<Delete2> {
  @override
  Widget build(BuildContext context) {
  final int args = ModalRoute.of(context).settings.arguments;
    return Container(
      child: Text(args.toString()),
    );
  }
}

(Полная документация)

person Viren V Varasadiya    schedule 22.02.2020
comment
спасибо за ответ, я отредактировал вопрос, чтобы уточнить названные маршруты. - person Nerdy Bunz; 22.02.2020
comment
Тогда я думаю, что onroutegenerate - лучшее решение для вас. - person Viren V Varasadiya; 22.02.2020