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);
}
相關文章
相關標籤/搜索