學習Flutter的第八天

4. 路由

4.1 靜態(tài)路由

靜態(tài)路由(即命名路由)

靜態(tài)路由在通過Navigator跳轉之前,需要在MaterialApp組件內顯式聲明路由的名稱,而一旦聲明,路由的跳轉方式就固定了。通過在MaterialApp內的routes屬性進行顯式聲明路由的定義。


class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter Demo",
      theme: ThemeData(primarySwatch: Colors.blue),
      // home: const Tabs(),
      initialRoute: "/",
      routes: {
        "/": (context) => const Tabs(),
        /*
        也可以使用大括號的寫法
        "/": (context) { reutnr const Tabs() },
        */
        "/s": (context) => const Search(
              title: '',
            )
      },
    );
  }
}

注:使用命名路由時,home 要注釋掉,使用 initialRoute


class _MessageState extends State<Message> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
              onPressed: () {
                // 命名路由跳轉頁面方式
                Navigator.pushNamed(context, "/s",
                    arguments: {"title": "我是標題", "content": "我是內容"});
              },
              child: const Text("跳轉搜索頁面"))
        ],
      ),
    );
  }
}

4.2 動態(tài)路由

動態(tài)路由無需在MaterialApp內的routes中注冊即可直接使用:RootPage —> Apage

Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {
        return const Search();
        }
    )
);

動態(tài)路由中,需要傳入一個Route,這里使用的是MaterialPageRoute,它可以使用和平臺風格一致的路由切換動畫,在iOS上左右滑動切換,Android上會上下滑動切換。也可以使用CupertinoPageRoute實現(xiàn)全平臺的左右滑動切換。
當然也可以自定義路由切換動畫,使用PageRouteBuilder:使用FadeTransition
做一個漸入過渡動畫。

使用 CupertinoPageRoute 時,需要引入 import 'package:flutter/cupertino.dart';

Navigator.of(context).push(
  PageRouteBuilder(
    transitionDuration: Duration(milliseconds: 250), // //動畫時間為0.25秒
    pageBuilder: (BuildContext context,Animation animation,
        Animation secondaryAnimation){
      return FadeTransition( //漸隱漸入過渡動畫
        opacity: animation,
        child: Search()
       );
     }
  )
);

在這之前有必要說明:
Navigator.of(context).pushNavigator.push兩著并沒有特別的區(qū)別,看源碼也得知,后者其實就是調用了前者。
of:獲取Navigator當前已經實例的狀態(tài)。

4.3 跳轉傳值

接收值

import 'package:flutter/material.dart';

class Search extends StatefulWidget {
  final String title;
  final String content;
  const Search({super.key, required this.title, this.content = "默認內容"});

  @override
  State<Search> createState() => _SearchState();
}

class _SearchState extends State<Search> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // 通過 widget 進行取值的操作
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(widget.content),
          const SizedBox(height: 20),
          ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: const Text("返回上一頁"))
        ],
      ),
    );
  }
}

傳值

import 'package:flutter/material.dart';
import '../search.dart';

class Message extends StatefulWidget {
  const Message({super.key});

  @override
  State<Message> createState() => _MessageState();
}

class _MessageState extends State<Message> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return const Search(
                    title: '搜索Title',
                    content: "我是傳過去的值",
                  );
                }));
              },
              child: const Text("跳轉搜索頁面"))
        ],
      ),
    );
  }
}

4.4 pop

返回當前路由棧的上一個界面。

Navigator.pop(context);

4.5 替換路由

第一頁面 -> 第二頁面 -> 第三頁面。

在第二個界面中,使用 pushReplacementNamed,跳轉到第三個頁面,在第三個頁面點返回時,就回到了第一個頁面。而不是第二個。

Navigator.of(context).pushReplacementNamed("/C");

4.6 返回跟路由

參考:http://www.itdecent.cn/p/beda41170b60

// 移除全部
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(
  builder: (context) {
    return const Tabs();
  },
), (route) => false);

// 或者

// 移除全部
Navigator.of(context).pushNamedAndRemoveUntil("/", (route) => false);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Flutter 學習筆記-基礎篇 如果你要獲取與該筆記配套的源碼,請點擊這里[https://github.com...
    Stephen_Zhou閱讀 2,302評論 2 11
  • 路由(Route)在移動開發(fā)中通常指頁面(Page),Route在Android中通常指一個Activity,在i...
    zombie閱讀 591評論 0 0
  • 1、flutter的開始 1、認識文件夾 文件夾名稱作用androidandroid平臺相關代碼iosios平臺相...
    Y__W閱讀 1,152評論 0 4
  • 我們通常會用屏(Screen)來稱呼一個頁面(Page),一個完整的App應該是有多個Page組成的。 在之前的案...
    Imkata閱讀 680評論 0 1
  • 邂逅FLutter 萬物皆是Widget 一般縮進2個空格 文字居中 Widget Center() Materi...
    JackLeeVip閱讀 3,491評論 0 4

友情鏈接更多精彩內容