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

希望对大家有所帮助...