Flutter:如何使用 Navigator PushNamed 为 Screen Constructor 发送所需参数
Flutter: how to use Navigator PushNamed to send required parameters for Screen Constructor
我有一个路线图,我从中调用我的屏幕。我需要将三个参数传递给下一个屏幕的构造方法。我想使用 Navigator.pushNamed() 但当我使用参数 属性 时它似乎不起作用。
//Screen to build
class ResultPage extends StatelessWidget{
ResultPage(
{@required this.calc1Result,
@required this.calc2Text,
@required this.interpretation});
final String calc1Result;
final String calc2Text;
final String interpretation;
@override
Widget build(BuildContext context) { //etc.. etc... }
--------------------------------------------------------------------------
然后我需要从另一个页面调用这个屏幕:
//Call to ResultPage from another screen
Calculator calculator = Calculator(param1: param1, param2: param2);
Navigator.pushNamed(context, 'resultPage', arguments:
{
'calc1Result': calculator.getCalc1Result(),
'calc2Text': calculator.getCalc2Text()
'interpretation': calculator.getInterpretation(),
});
它根本不起作用,结果总是 Null。
而如果我使用 Navigator.push() 做同样的事情,它会起作用。
//Working alternative - I don't want to use this:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ResultPage(
calc1Result: calculator.getCalc1Result(),
calc2Text: calculator.getCalc2Text(),
interpretation: calculator.getInterpretation(),
),
),
);
您是否已将命名路由添加到 MaterialApp 小部件?
MaterialApp(
routes: {
ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(),
},
);
看这里:
https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
然后在 ResultPage 中你必须提取参数:
@override
Widget build(BuildContext context) {
// Extract the arguments from the current ModalRoute settings and cast
// them as ScreenArguments.
final args = ModalRoute.of(context).settings.arguments;
...
}
我遇到了同样的麻烦。我认为您不能将构造函数与 Navigator.pushNamed().
一起使用
所以你像参数一样发送数据,然后通过以下方式将它们放在另一个页面上:Map arguments = ModalRoute.of(context)?.settings.arguments as Map;
现在你有一个地图(字典),你可以通过一个键来访问。
根据您的示例:
//Call to ResultPage from another screen
Calculator calculator = Calculator(param1: param1, param2: param2);
Navigator.pushNamed(context, 'resultPage', arguments:
{
'calc1Result': calculator.getCalc1Result(),
'calc2Text': calculator.getCalc2Text()
'interpretation': calculator.getInterpretation(),
});
另一个屏幕:
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Map arguments = ModalRoute.of(context)?.settings.arguments as Map;
String someResult = arguments['calc1Result'];
return Container(
child: Text(someResult),
);
}
}
希望对大家有所帮助...
我有一个路线图,我从中调用我的屏幕。我需要将三个参数传递给下一个屏幕的构造方法。我想使用 Navigator.pushNamed() 但当我使用参数 属性 时它似乎不起作用。
//Screen to build
class ResultPage extends StatelessWidget{
ResultPage(
{@required this.calc1Result,
@required this.calc2Text,
@required this.interpretation});
final String calc1Result;
final String calc2Text;
final String interpretation;
@override
Widget build(BuildContext context) { //etc.. etc... }
--------------------------------------------------------------------------
然后我需要从另一个页面调用这个屏幕:
//Call to ResultPage from another screen
Calculator calculator = Calculator(param1: param1, param2: param2);
Navigator.pushNamed(context, 'resultPage', arguments:
{
'calc1Result': calculator.getCalc1Result(),
'calc2Text': calculator.getCalc2Text()
'interpretation': calculator.getInterpretation(),
});
它根本不起作用,结果总是 Null。
而如果我使用 Navigator.push() 做同样的事情,它会起作用。
//Working alternative - I don't want to use this:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ResultPage(
calc1Result: calculator.getCalc1Result(),
calc2Text: calculator.getCalc2Text(),
interpretation: calculator.getInterpretation(),
),
),
);
您是否已将命名路由添加到 MaterialApp 小部件?
MaterialApp(
routes: {
ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(),
},
);
看这里: https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
然后在 ResultPage 中你必须提取参数:
@override
Widget build(BuildContext context) {
// Extract the arguments from the current ModalRoute settings and cast
// them as ScreenArguments.
final args = ModalRoute.of(context).settings.arguments;
...
}
我遇到了同样的麻烦。我认为您不能将构造函数与 Navigator.pushNamed().
一起使用所以你像参数一样发送数据,然后通过以下方式将它们放在另一个页面上:Map arguments = ModalRoute.of(context)?.settings.arguments as Map;
现在你有一个地图(字典),你可以通过一个键来访问。
根据您的示例:
//Call to ResultPage from another screen
Calculator calculator = Calculator(param1: param1, param2: param2);
Navigator.pushNamed(context, 'resultPage', arguments:
{
'calc1Result': calculator.getCalc1Result(),
'calc2Text': calculator.getCalc2Text()
'interpretation': calculator.getInterpretation(),
});
另一个屏幕:
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Map arguments = ModalRoute.of(context)?.settings.arguments as Map;
String someResult = arguments['calc1Result'];
return Container(
child: Text(someResult),
);
}
}
希望对大家有所帮助...