Flutter: 把参数传递给命名路由

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      /// 提供处理命名路由的函数。 使用此功能识别被推送的命名路由,并创建正确的路由屏幕
      onGenerateRoute: (settings) {
        if (settings.name == PassArgumentsScreen.routeName) {
          /// 将参数转换为正确的类型:ScreenArguments
          final ScreenArguments args = settings.arguments;

          // 然后,从参数中提取所需的数据,将数据传递到正确的页面
          return MaterialPageRoute(
            builder: (context) {
              return PassArgumentsScreen(
                title: args.title,
                message: args.message,
              );
            },
          );
        }
      },
      title: 'Navigation with Arguments',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            /// 导航到指定路线的按钮。 命名路线,自己提取参数。
            RaisedButton(
              child: Text("提取参数"),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => ExtractArgumentsScreen(),
                    settings: RouteSettings(
                      arguments: ScreenArguments(
                        '提取参数',
                        'This message is extracted in the build method.',
                      ),
                    ),
                  ),
                );
              },
            ),
            /// 提取onGenerateRoute函数中的参数并传递它们到页面
            RaisedButton(
              child: Text("接收参数"),
              onPressed: () {
                Navigator.pushNamed(
                  context,
                  PassArgumentsScreen.routeName,
                  arguments: ScreenArguments(
                    '接收参数',
                    'This message is extracted in the onGenerateRoute function.',
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

/// 一个Widget,它从ModalRoute中提取必要的参数
class ExtractArgumentsScreen extends StatelessWidget {
  static const routeName = '/extractArguments';

  @override
  Widget build(BuildContext context) {
    final ScreenArguments args = ModalRoute.of(context).settings.arguments;

    return Scaffold(
      appBar: AppBar(
        title: Text(args.title),
      ),
      body: Center(
        child: Text(args.message),
      ),
    );
  }
}

/// 一个Widget,它通过构造函数接受必要的参数
class PassArgumentsScreen extends StatelessWidget {
  static const routeName = '/passArguments';

  final String title;
  final String message;

  const PassArgumentsScreen({
    Key key,
    @required this.title,
    @required this.message,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Text(message),
      ),
    );
  }
}

class ScreenArguments {
  final String title;
  final String message;

  ScreenArguments(this.title, this.message);
}

猜你喜欢

转载自www.cnblogs.com/ajanuw/p/11029245.html