Данные, переданные в Stateful Flutter Widget с использованием Navigator.pushNamed (), являются нулевыми - PullRequest
0 голосов
/ 22 февраля 2020

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

Тем не менее, это несколько особый случай, потому что на экране виджет Stateful и я Я использую Навигационные маршруты метод навигации.

Данные также могут иметь тип 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}); 

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

Я также пробовал гуглить, документы, stackoverflow (даже этот конкретный c ответ ... но я, кажется, не могу извлечь из этого уместное значение), и Бакарди ... и я очень раздражен. Пожалуйста, кто-нибудь укажет на мою синтаксическую ошибку и в какой строке. Спасибо!

1 Ответ

1 голос
/ 22 февраля 2020

Вы должны получить доступ к данным, используя 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()),
    );
  }
}

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

...