Flutter 命名路由及傳值 !

命名路由是區別於基本路由的一種存在,方便於大型項目中路由的統一管理,如今,在前面基本路由的項目基礎上實現實現命名路由。vue

使用步驟

路由配置

  命名路由在使用前,須要在根組件main.dart中進行簡單的配置(前面是頁面路徑,後面是頁面中的組件名稱): react

在這裏插入圖片描述
在這裏插入圖片描述

main.dart 主要代碼:app

import 'package:flutter/material.dart';

import 'pages/Tabs.dart';
import 'pages/Form.dart';
import 'pages/Search.dart';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:Tabs(),
      routes: {
        '/form':(context)=>FormPage(),
        '/search':(context)=>SearchPage(),
      }
    );
  }
}
複製代碼
路由跳轉

  路由配置完成之後,在須要進行路由跳轉的地方直接輸入上面配置的名稱使用就能夠了(從Home.dart中跳轉到Search.dart)。 less

在這裏插入圖片描述
Home.dart 主要代碼:

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        RaisedButton(
            child: Text("跳轉到搜索頁面"),
            onPressed: () {
              //路由跳轉
              Navigator.pushNamed(context, '/search');
            },
            color: Theme.of(context).accentColor,
            textTheme: ButtonTextTheme.primary
        ),
        SizedBox(height: 20),        

      ],
    );
  }
}
複製代碼
路由模塊化

  在vue和react中,爲了方便管理大量的路由,一般是採用路由模塊化來處理,在flutter中,也能夠使用路由模塊化來處理大量的命名路由。ide

  爲了如今路由模塊化,首先須要在lib目錄下,新建routes文件夾,在該文件夾下新建Routes.dart頁面;而後將前面的路由配置移入到該文件中。模塊化

Routes.dart 主要代碼:ui

import 'package:flutter/material.dart';

import '../pages/Tabs.dart';
import '../pages/Form.dart';
import '../pages/Search.dart';//配置路由
final routes={
      '/':(context)=>Tabs(),
      '/form':(context)=>FormPage(),'/search':(context,{arguments})=>SearchPage(arguments:arguments),
};

//固定寫法
var onGenerateRoute=(RouteSettings settings) {
      // 統一處理
      final String name = settings.name; 
      final Function pageContentBuilder = routes[name];
      if (pageContentBuilder != null) {
        if (settings.arguments != null) {
          final Route route = MaterialPageRoute(
              builder: (context) =>
                  pageContentBuilder(context, arguments: settings.arguments));
          return route;
        }else{
            final Route route = MaterialPageRoute(
              builder: (context) =>
                  pageContentBuilder(context));
            return route;
        }
      }
};
複製代碼

  而後在main.dart中引入這個頁面就能夠了。this

import 'package:flutter/material.dart';
import 'routes/Routes.dart';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {  
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // home:Tabs(),   
      initialRoute: '/',     //初始化的時候加載的路由
      onGenerateRoute: onGenerateRoute
     
    );
  }
}
複製代碼
命名路由傳參(從Home.dart頁面跳轉到Search.dart頁面)

  在上面的Routes.dart頁面中,多了一個onGenerateRoute的變量,這個是命名路由傳參的固定寫法。在命名路由中傳參的時候,除了須要添加前面說到的變量,還須要完成如下操做:spa

  1. 配置路由時,配置可選參數
    在這裏插入圖片描述
  2. 路由跳轉前的頁面中,寫入須要傳遞的可選參數
    在這裏插入圖片描述

Home.dart 主要代碼:3d

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  HomePage({Key key}) : super(key: key);
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        RaisedButton(
            child: Text("跳轉到搜索頁面"),
            onPressed: () {
              //路由跳轉
              Navigator.pushNamed(context, '/search',arguments: {
                "id":123
              });
            },
            color: Theme.of(context).accentColor,
            textTheme: ButtonTextTheme.primary
        ),
      ],
    );
  }
}
複製代碼
  1. 在路由跳轉後的頁面中,接收傳遞的參數
    在這裏插入圖片描述

Search.dart 主要代碼:

import 'package:flutter/material.dart';

class SearchPage extends StatelessWidget {
  
  final arguments;
  SearchPage({this.arguments});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title: Text("搜索頁面"),
      ) ,
      body: Text("搜索頁面內容區域${arguments != null ? arguments['id'] : '0'}"),
    );
  }
}
複製代碼
相關文章
相關標籤/搜索