【问题标题】:Data passed to Stateful Flutter Widget using Navigator.pushNamed() is null使用 Navigator.pushNamed() 传递给 Stateful Flutter Widget 的数据为 null
【发布时间】:2020-06-06 11:04:48
【问题描述】:

使用 Flutter,我试图通过构造函数将数据传递到新屏幕。

不过,这有点特殊,因为屏幕是 Stateful 小部件,而我使用的是 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();
  }
}

我传递数据 FROM 的屏幕包含以下代码:

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}); 

但在目标屏幕中得到相同的结果(传递的数据为空)。这有点像棒球……击球手是初始屏幕……接球手是我们要导航到的屏幕。球就是数据。除了在我的情况下,击球手似乎是 Sammy Sosa 并且球在某个地方离开了公园......这对小熊队来说很好,但对我来说不是。

我也尝试过谷歌搜索、文档、stackoverflow(甚至this specific answer...,但我似乎无法从中提取相关含义)和百加得...我变得非常恼火。请有人指出我的语法错误以及它在哪一行。谢谢!

【问题讨论】:

  • 嘿,你试过用 Navigator.push() 吗?
  • 不,我不想。我希望按原样回答问题。不过谢谢。
  • 它只是用于调试,如果它以这种方式工作,我们可能会了解问题。

标签: flutter dart statefulwidget


【解决方案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()),
    );
  }
}

(Full Documentation)

【讨论】:

  • 感谢您的回答,我编辑了问题以澄清命名路线。
  • 那么我认为 onroutegenerate 是最适合您的解决方案。
猜你喜欢
  • 2021-09-26
  • 2020-02-27
  • 2020-12-17
  • 2019-07-08
  • 2021-10-17
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多