Flutter学习之旅 - 路由

这篇具有很好参考价值的文章主要介绍了Flutter学习之旅 - 路由。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flutter路由介绍

flutter中的路由通俗就是页面跳转。在Flutter中通过Navigator(学过reactjs小程序的小伙伴应该很清楚)组件管理路由导航
Flutter给我们提供了俩种配置路由跳转的方式: 1.基本路由 2.命名路由

普通路由

//格式
Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {
  return const WidgetName();
}));
//search.dart (跳转的页面)
import 'package:flutter/material.dart';

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

  
  State<SearchPage> createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("你好"),
      ),
      body: const Text("搜索页面"),
    );
  }
}
//home.dart
import 'package:flutter/material.dart';
import 'package:flutter_luyou_learn/pages/search.dart'; //引入SearchPage

...
class _HomePageState extends State<HomePage>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;
  
  void initState() {
    super.initState();
    _tabController = TabController(length: 5, vsync: this);
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          backgroundColor: const Color.fromRGBO(255, 255, 255, 1),
          leading: const CircleAvatar(
            backgroundImage: NetworkImage(imageUrl(String)),
          ),
          title: ElevatedButton(
            onPressed: () {
            //主要(路由)
              Navigator.of(context)
                  .push(MaterialPageRoute(builder: (BuildContext context) {
                return const SearchPage();
              }));
            },
            child: const Text("搜索"),
          ),
          bottom: TabBar(
            controller: _tabController,
            indicatorColor: Colors.red,
            labelColor: Colors.red,
            unselectedLabelColor: Colors.black,
            tabs: const [
              Tab(child: Text("直播")),
              Tab(child: Text("推荐")),
              Tab(child: Text("热门")),
              Tab(child: Text("动画")),
              Tab(child: Text("影视")),
            ],
          )),
      body: TabBarView(
        controller: _tabController,
        children: const [
          Text("直播页"),
          Text("推荐页"),
          Text("热门页"),
          Text("动画页"),
          Text("影视页")
        ],
      ),
    );
  }
}

模板的知识请看这里

普通路由传值

跳转传值和调用组件传值的实现方法是一样的

//download.dart (新建一个组件)
import 'package:flutter/material.dart';

class DownloadPage extends StatefulWidget {
  final String titleMsg; //像传值一样定义
  const DownloadPage({
    super.key,
    this.titleMsg = "已经缓存视频", //没有传入默认使用这个
  });

  
  State<DownloadPage> createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("离线缓存"),
      ),
      // body: const Text("你好"),
      body: _DownloadPageBody(
        titleMsg: widget.titleMsg, //获取DownloadPage里的属性titleMsg
      ),
    );
  }
}

class _DownloadPageBody extends StatelessWidget {
  String titleMsg;
  _DownloadPageBody({Key? key, required this.titleMsg}) : super(key: key);
  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          width: 100,
          height: 50,
          decoration: const BoxDecoration(),
          child: Text(titleMsg),//显示输出
        )
      ],
    );
  }
}

//my.dart(关键代码)
ElevatedButton(
  onPressed: () {
    Navigator.of(context).push(MaterialPageRoute(
      builder: (BuildContext context) {
        return const DownloadPage(titleMsg: "测试",);
        //return const DownloadPage();
      }));
  },
  child: const Icon(Icons.ads_click),//随意
),

命名路由

//lib.main.dart
import 'package:flutter/material.dart';
import 'package:项目名/pages/tabs.dart';
import 'package:项目名/pages/tabs/my.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return MaterialApp(
      //记住这里不能写const MaterialApp()
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      // home: Tabs(),  //去除
      routes: {//添加
        '/': (context) => const Tabs(),
        '/search': (context) => const SearchPage()
      },
    );
  }
}
//lib/pages/tabs.dart
import 'package:flutter/material.dart';
//import 'package:项目名/lib目录下的文件或文件夹'
import 'package:项目名/pages/tabs/home.dart';
import 'package:项目名/pages/tabs/my.dart';

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

  
  State<Tabs> createState() => _TabsState();
}

class _TabsState extends State<Tabs> {
  int _currentIndex = 0;
  //添加
  final List<Widget> _pages = const [HomePage(), MyPage()];
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: null,
      body: _pages[_currentIndex], //修改
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) {
          //index:点击索引值
          // print(index);
          setState(() {
            _currentIndex = index;
          });
        },
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "首页"),
          BottomNavigationBarItem(
              icon: Icon(Icons.my_library_add_outlined), label: "我的")
        ],
      ),
    );
  }
}

//home.dart(命名路由跳转关键代码)
ElevatedButton(
  onPressed: () {
    //格式:Navigator.pushNamed(context, '/跳转的路径名称');
    Navigator.pushNamed(context, '/search'); //命名路由跳转
  },
  child: const Text("搜索"),
),
routes的配置提到外面(使用的是Map)
  1. 配置主函数main.dart
//main.dart
import 'package:flutter/material.dart';
import 'package:mmly_learn_flutter/pages/tabs.dart';
import 'package:mmly_learn_flutter/pages/tabs/my.dart';
import 'package:mmly_learn_flutter/pages/tabs/search.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  MyApp({super.key});

  //1、配置路由
  Map<String, WidgetBuilder> routes = {
    '/': (context) => const Tabs(),
    '/search': (context) => const SearchPage()
  };
  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return MaterialApp(
      //记住这里不能写const MaterialApp()
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      // home: Tabs(),
      initialRoute: "/", //初始化路由
      onGenerateRoute: (RouteSettings settings) {
        //2、配置路由(先把它当作固定格式)
        final String? name = settings.name;
        final Function? pageContrentBuilder = routes[name];
        if (pageContrentBuilder != null) {
          if (settings.name != null) {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContrentBuilder(context,
                    arguments: settings.arguments));
            return route;
          }
          else {
            final Route route = MaterialPageRoute(
              builder: (context) => pageContrentBuilder!(context));
            return route;
          }
        } 
        return null;
      },
    );
  }
}
命名路由传值

跳转页面后传值

//search.dart(找到你需要跳转的页面进行处理)
import 'package:flutter/material.dart';

class SearchPage extends StatefulWidget {
  final Map arguments; //在需要传值的页面传入命名路由导航的argments
  const SearchPage({super.key, required this.arguments});

  
  State<SearchPage> createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
  
  void initState() {
    super.initState();
    print(widget.argments); //查看传入的值
    // print(widget.arguments['name']);//赋值格式
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("搜索"),
      ),
    );
  }
}
//main.dart(配置了routes的组件中,一般是main.dart)
Map<String, WidgetBuilder> routes = {
  '/': (context) => const Tabs(),
  '/search': (context, {argments}) => SearchPage(arguments: arguments)
};
//home.dart(点击跳转的按钮或者组件)
Navigator.pushNamed(context, '/search', arguments: {"title": "我是命名路由传值", "aid": 10}); 

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);

  //1、配置路由
  Map<String, WidgetBuilder> routes = {
    '/': (context) => const Tabs(),
    '/search': (context, {arguments}) => SearchPage(arguments: arguments),
    '/login': (context) => const LoginPage(),
    '/loginFirst': (context) => const LoginFirstPage()
  };
  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return MaterialApp(
      //记住这里不能写const MaterialApp()
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      // home: Tabs(),
      initialRoute: "/", //初始化路由
      onGenerateRoute: (RouteSettings settings) {
        //2、配置路由(先把它当作固定格式)
        final String? name = settings.name;
        final Function? pageContrentBuilder = routes[name];
        if (pageContrentBuilder != null) {
          if (settings.arguments != null) {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContrentBuilder(context,
                    arguments: settings.arguments));
            return route;
          } else {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContrentBuilder(context));
            return route;
          }
        }
        return null;
      },
    );
  }
}

Flutter学习之旅 - 路由

上图有可能(context, {argments}) => SearchPage(arguments: arguments)写成了(context, argments) => SearchPage(arguments: arguments)

  • settings: RouteSettings("/...",null)
  • settings.name: /...(路径名),
  • settings.arguments: null(传入的值)

路由跳转

我们希望跳转后接着跳转到另一个页面

  1. 首先实现1次跳转(步骤跟上面的知识一致,我们这里就以login为案例)
//lib/pages/user/login.dart
import 'package:flutter/material.dart';

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

  
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("登录页面"),
      ),
      body: Column(
        children: [ElevatedButton(onPressed: () {
        /*
        //返回上一级
        Navigator.of(context).pop();
        */}, child: const Text("执行登录"))],
      ),
    );
  }
}
//lib/main.dart(路由配置,不一定非是这个文件)
Map<String, WidgetBuilder> routes = {
    '/': (context) => const Tabs(),
    '/search': (context, {arguments}) => SearchPage(arguments: arguments),
    '/login': (context) => const LoginPage() //添加
  };
//lib/pages/tabs/home.dart(按自己喜好的文件)

返回上一级路由

//返回上一级
Navigator.of(context).pop();

替换路由

//当然替换的路由路径(/registerSecound)也要添加在Map routes配置中
//注意: 这个方法是将之前的页面进行替换(覆盖),所以之前的页面是销毁的
Navigator.of(context).pushReplacementNamed('/registerSecound')

返回到根路由

  1. 是使用Scaffold组件appBar
  2. 通过Navigator.of(context).pushAndRemoveUntil进行返回
Navigator.of(context).pushAndRemoveUntil(
  MaterialPageRoute(builder: (BuildContext context) {
    return const Tabs(); //返回到根页面
}), (route) => false);

返回Tabs后到指定页面

因为之前学习的时候有_currentIndex来指定底部在那个页面,所以

import 'package:flutter/material.dart';
//import 'package:项目名/lib目录下的文件或文件夹'
import 'package:mmly_learn_flutter/pages/tabs/home.dart';
import 'package:mmly_learn_flutter/pages/tabs/my.dart';

class Tabs extends StatefulWidget {
  final int index; //添加
  const Tabs({super.key, this.index = 0}); //添加

  
  State<Tabs> createState() => _TabsState();
}

class _TabsState extends State<Tabs> {
  int _currentIndex = 0;
  
  void initState() {
    //添加
    super.initState();
    _currentIndex = widget.index;
  } //修改

  //添加
  final List<Widget> _pages = const [HomePage(), MyPage()];
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: null,
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "首页"),
          BottomNavigationBarItem(
              icon: Icon(Icons.my_library_add_outlined), label: "我的")
        ],
      ),
    );
  }
}

主要是添加(可以在上图代码中查看)文章来源地址https://www.toymoban.com/news/detail-437968.html

final int index;
this.index = 0
void initState() {...;_currentIndex = widget.index;}
Navigator.of(context).pushAndRemoveUntil(
                        MaterialPageRoute(builder: (BuildContext context) {
                      return const Tabs(index: 1); //注意: 这下标是以0开始的
                    }), (route) => false);

到了这里,关于Flutter学习之旅 - 路由的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Flutter】Flutter 如何获取当前路由

    获取当前路由的信息可以帮助我们更好地理解用户的行为和应用的状态。例如,我们可能需要知道用户是从哪个页面

    2024年02月09日
    浏览(38)
  • Flutter 命名路由

    我们可以通过创建一个新的Route,使用Navigator来导航到一个新的页面,但是如果在应用中很多地方都需要导航到同一个页面(比如在开发中,首页、推荐、分类页都可能会跳到详情页),那么就会存在很多重复的代码。在这种情况下,我们就可以使用 命名路由。 优点: 名称

    2024年02月14日
    浏览(35)
  • Flutter之自定义路由切换动画

    在Flutter中,我们可以通过Navigator来实现路由管理,包括路由的跳转和返回等。默认情况下,Flutter提供了一些简单的路由切换动画,但是有时候我们需要自定义一些特殊的动画效果来提高用户体验。本文将介绍如何在Flutter中实现自定义的路由切换动画。 在Flutter中,路由切换

    2024年02月10日
    浏览(37)
  • Flutter路由的几种用法

    Flutter路由跳转 search.dart页面 命名路由跳转需要先配置路由 routers.dart配置文件 然后需要在首页添加initialRoute和onGenerateRoute配置 context属性中写配置中的路径,arguments属性中是跳转需要带的参数,跳转到form.dart页面并接收参数。 命名路由替换跳转用pushReplacementNamed,跳转新页面

    2024年02月04日
    浏览(41)
  • Flutter超好用的路由库-fluro

    fluro是一个流行的Flutter插件,用于实现高级路由管理。它提供了灵活的路由配置和导航功能, 支持命名路由、参数传递、路由拦截、动画效果 等,使得在Flutter应用程序中管理页面导航变得更加简单和可扩展。下面是对fluro插件的详细介绍: 您可以通过在pubspec.yaml文件中添加

    2024年02月08日
    浏览(31)
  • Flutter的路由router-页面跳转

    在Flutter中,路由(Router)是用于管理不同页面之间导航的机制。它允许您在应用程序中切换和管理不同的屏幕或视图。Flutter提供了多种方式来实现路由,包括基本路由、命名路由和第三方路由管理库。下面是对这些不同方式的详细介绍: Flutter提供了一种基本的路由管理方式

    2024年02月08日
    浏览(50)
  • flutter系列之:如何自定义动画路由

    目录 简介 自定义跳转使用 flutter动画基础 实现一个自定义的route 总结 flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flutter中进行跳转的话,只需要向Navigator中传入一个MaterialPageRoute就可以了。 但是MaterialPageRoute太普通了,如果我们想要做点不同的跳转特效

    2023年04月19日
    浏览(46)
  • flutter开发实战-常用的路由Route配置

    flutter开发实战-常用的路由Route配置 路由(Route)在移动开发中通常指页面(Page),这跟 Web 开发中单页应用的 Route 概念意义是相同的,Route 在 Android中 通常指一个 Activity,在 iOS 中指一个 ViewController。所谓路由管理,就是管理页面之间如何跳转,通常也可被称为导航管理。

    2024年02月13日
    浏览(50)
  • flutter getx nested navigation 嵌套路由

    https://youtu.be/SXER4JVBFps 嵌套路由可以用在如购物确认向导界面切换。 使用 getx 实现嵌套路由,需要如下步骤: 通过 Navigator 组件的 key 属性 用 Get.nestedKey(1) 进行标记 onGenerateRoute 决定去哪个视图界面 initialRoute 初始路由 通过 Get.toNamed 的 id 属性执行嵌套路由 第一步:准备工作

    2024年02月11日
    浏览(42)
  • Flutter特殊用法介绍

    Flutter是一种开源移动应用程序开发框架,具有高效、快速、美观、灵活等特点。本文将介绍Flutter中的一些特殊用法,帮助开发者更好地使用Flutter进行应用程序开发。 Flutter可以与原生代码进行交互,例如与Android的Java和Kotlin代码、与iOS的Objective-C和Swift代码等进行交互。Flut

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包