使用 Navigator.pushNamed() 传递给 Stateful Flutter Widget 的数据为空
Data passed to Stateful Flutter Widget using Navigator.pushNamed() is null
使用 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();
}
}
我传递数据的屏幕包含以下代码:
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});
但在目标屏幕中得到相同的结果(传递的数据为空)。这有点像棒球……击球手是初始屏幕……而接球手是我们导航到的屏幕。球就是数据。除了我的情况,击球手似乎是萨米·索萨,球在公园外的某个地方……这对小熊队来说很好,但对我来说不是。
我也试过谷歌搜索、文档、Whosebug(甚至 this specific answer...但我似乎无法从中提取相关含义)和 Bacardi...我正在很生气。请有人指出我的语法错误以及它在哪一行。谢谢!
您必须使用 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()),
);
}
}
使用 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();
}
}
我传递数据的屏幕包含以下代码:
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});
但在目标屏幕中得到相同的结果(传递的数据为空)。这有点像棒球……击球手是初始屏幕……而接球手是我们导航到的屏幕。球就是数据。除了我的情况,击球手似乎是萨米·索萨,球在公园外的某个地方……这对小熊队来说很好,但对我来说不是。
我也试过谷歌搜索、文档、Whosebug(甚至 this specific answer...但我似乎无法从中提取相关含义)和 Bacardi...我正在很生气。请有人指出我的语法错误以及它在哪一行。谢谢!
您必须使用 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()),
);
}
}