zoukankan      html  css  js  c++  java
  • flutter 使用fluro

    1.在pubspec.yaml文件中写以下这条,并pub get

      fluro: 1.7.8

    2.在main.dart注册路由,如果有报错,在使用编辑器的时候引入相应的库就行

      @override
      Widget build(BuildContext context) {
    
        // 注册路由
        final router = FluroRouter();
        Routes.configureRoutes(router);
        Application.router = router;
    return MaterialApp( onGenerateRoute:Application.router.generator, //注册路由 // home: MyHomePage(), home: IndexPage(), ); }

    3.创建一个routers文件夹,放相关的路由配置

    a.  创建applaction.dart

      

    import 'package:fluro/fluro.dart';
    
    class Application{
      static FluroRouter router;
    }

    b.创建routers.dart,这个文件是用来配置路由的

    // 这个页面是设置路由跳转衔接模块
    
    import 'package:fluro/fluro.dart';
    import 'package:flutter/material.dart';
    import './router_handler.dart';
    
    class Routes { //配置类
    
    //  这边是配置路由
      static String root = '/'; //根目录
      static String index = "/index";
      static String searchpage = "/searchpage"; // 搜索页面
    
    
      //静态方法
      static void configureRoutes(FluroRouter router){//路由配置
        //找不到路由
        router.notFoundHandler = new Handler(
            handlerFunc: (BuildContext context,Map<String,List<String>> params){
              print('页面找不到报错了');
            }
        );
        //整体配置--对应路由的页面  handler的值是跳转另一个页面后要处理的内容
        router.define(root, handler: rootPageHanderl);
        router.define(index, handler: indexPageHanderl);
        router.define(searchpage, handler: searchpageHanderl);
    
    
      }
    
    }

    c.创建router_handler.dart文件,这个文件是路由具体要跳的页面,也可以和上面的那个文件写一起

    // 这个页面是设置穿什么参数等
    
    import 'package:blog/indexPage.dart';
    import 'package:blog/pages/searchPage.dart';
    import 'package:blog/pages/splash_page.dart';
    import 'package:flutter/material.dart';
    import 'package:fluro/fluro.dart';
    
    
    
    
    
    
    
    // 跳转商品详情页---带参数
    //Handler detailsHanderl = Handler(
    //    handlerFunc: (BuildContext context, Map<String, List<String>> params) {
    //      String goodsId = params['id'].first;
    //      print('index>details goodsID is ${goodsId}');
    //      return DetailsPage(goodsId);
    //  });
    //
    
    
    // 跳转首页--不带参数
    Handler indexPageHanderl = Handler(
        handlerFunc: (BuildContext context, Map<String, List<String>> params) {
          return IndexPage();
        });
    
    // 跳转引导页
    Handler rootPageHanderl = Handler(
      handlerFunc: (BuildContext context, Map<String, List<String>> params) {
        return SplashPage();
    });
    
    // 搜索页面
    Handler searchpageHanderl = Handler(
      handlerFunc: (BuildContext context, Map<String, List<String>> params) {
      return SearchPage();
    });

    d.创建文件nativgatior_utils.dart(这个文件是各种跳转方式)

    // 这个里面主要是进行路由跳转方法的公共书写
    
    import 'dart:io';
    import 'package:blog/indexPage.dart';
    import 'package:flutter/material.dart';
    import 'package:fluro/fluro.dart';
    //import 'package:maitianshanglv_driver/pages/app_common_module/login.dart';
    
    import './application.dart';
    import './routers.dart';
    
    class NavigatorUtil {
    
      /**
       * 退出app
       */
      static outApp(context){
        showDialog(
            context: context,
            builder: (context) =>
                AlertDialog(title: Text('确定要退出吗 ?', style: TextStyle(fontSize: 20),), actions: <Widget>[
                  RaisedButton(
                      child: Text('退出' , style: TextStyle(fontSize:  20),),
                      onPressed: () =>
                          exit(0)
                  ),
                  RaisedButton(
                      color: Colors.blue,
                      child: Text('取消' , style: TextStyle(fontSize:  20),),
                      onPressed: () => Navigator.of(context).pop(false)),
                ]));
      }
    
      //返回
      static void goBack(BuildContext context) {
        //Navigator.pop(context);
        if (Navigator.canPop(context)) {
          Navigator.pop(context);
        }else{
          Navigator.pushNamed(context, Routes.index);
        }
      }
    
      //带参数返回
      static void goBackWithParams(BuildContext context, result) {
        Navigator.pop(context, result);
      }
    
      //路由跳转指定页面,带参数
      static void goPage(BuildContext context, String title) {
        return Application.router.pop(context,title);
      }
    
      // 路由返回指定页面
      static void goBackUrl(BuildContext context, String title) {
        Navigator.popAndPushNamed(context, title);
      }
    
    
      // 路由跳转到主页面
      static void goHomePage(BuildContext context) {
        Application.router.navigateTo(context, Routes.root, replace: true); // 如果有给路由赋值就用Routes.root  root是routes文件定义的字符串路径,没有直接用"/"等路由
      }
    
    
      // 跳转到转场动画页面
      static Future jump(BuildContext context, String title) {
        return Application.router.navigateTo(context, title, transition: TransitionType.inFromRight);
      }
    
    
      /// 框架自带的有 native,nativeModal,inFromLeft,inFromRight,inFromBottom,fadeIn,custom
    
      static Future jumpLeft(BuildContext context, String title) {
        return Application.router.navigateTo(context, title, transition: TransitionType.inFromLeft);
      }
    
    
      static Future jumpRemove(BuildContext context) {
        return Navigator.of(context).pushAndRemoveUntil(
            MaterialPageRoute(builder: (context) => IndexPage(),),
                (route) => route == null);
      }
    
    
      /// 使用 IOS 的 Cupertino 的转场动画,这个是修改了源码的 转场动画
      /// /// Fluro本身不带,但是 Flutter自带
      static Future gotransitionCupertinoDemoPage(
          BuildContext context, String title) {
        return Application.router.navigateTo(context, title, transition: TransitionType.cupertino);
      }
    
    // 跳转到主页面并删除当前路由
      static void goToHomeRemovePage(BuildContext context) {
        Navigator.of(context).pushAndRemoveUntil(
            MaterialPageRoute(
              builder: (context) => IndexPage(),
            ), (route) => route == null);
      }
    
    // 跳转到登陆页并删除当前路由
    //  static void goToLoginRemovePage(BuildContext context) {
    //    Navigator.of(context).pushAndRemoveUntil(
    //        MaterialPageRoute(
    //          builder: (context) => Login(),
    //        ), (route) => route == null);
    //
    //  }
      ///指把当前页面在栈中的位置替换成跳转的页面(替换导航器的当前路由,通过推送路由[routeName]),当新的页面进入后,之前的页面将执行dispose方法。
      static pushReplacementNamed(BuildContext context, String routeName) {
        Navigator.pushReplacementNamed(context, routeName);
      }
    
      ///切换无参数页面 Navigator.of(context).pushNamed 直接进入一个新的界面
      static Future pushNamed(BuildContext context, String routeName) {
        return Application.router.navigateTo(context, routeName,
            transition: TransitionType.cupertino,
            routeSettings: RouteSettings(name: routeName),
            //    自定义动画
            transitionDuration: const Duration(milliseconds: 600));
      }
    
      //切换参数页面 Navigator.of(context).pushNamed
      static Future pushNamedWithParam(BuildContext context, String routeName,param) {
        return Application.router.navigateTo(context, routeName,
            transition: TransitionType.cupertino,
            routeSettings: RouteSettings(name: routeName,arguments: param),
            //    自定义动画
            transitionDuration: const Duration(milliseconds: 600));
    
      }
      /**
       * 指将当前页面pop,然后跳转到制定页面(将当前路由弹出导航器,并将命名路由推到它的位置。)
       */
      static popAndPushNamed(BuildContext context, String routeName){
        Navigator.maybePop(context)
            .then((v){
          pushNamed(context,routeName);
        });
      }
      /**
       * 指将当前页面pop,然后跳转到制定页面(将当前路由弹出导航器,并将命名路由推到它的位置。)
       */
      static popAndPushNamedWithParam(BuildContext context, String routeName,param){
        Navigator.maybePop(context)
            .then((v){
          pushNamedWithParam(context,routeName,param);
        });
      }
      /**
       * 指将制定的页面加入到路由中,然后将其他所有的页面全部pop, (Route<dynamic> route) => false将确保删除推送路线之前的所有路线。
       */
      static pushNamedAndRemoveUntil (BuildContext context, String routeName){
        Navigator.of(context).pushNamedAndRemoveUntil(routeName, (Route<dynamic> route) => false);
      }
      /**
       * 指将制定的页面加入到路由中
       */
      static pushNamedAndRemoveUntilThat(BuildContext context, String routeName,String untilRName){
        Navigator.of(context).pushNamedAndRemoveUntil(routeName, ModalRoute.withName(untilRName));
      }
      /**
       * 指将制定的页面加入到路由中
       */
      static pushNamedAndRemoveUntilThatParam(BuildContext context, String routeName,String untilRName,param){
        Navigator.of(context).pushNamedAndRemoveUntil(routeName, ModalRoute.withName(untilRName),arguments: param);
      }
    
      /**
       * maybePop 会自动进行判断,如果当前页面pop后,会显示其他页面,不会出现问题,则将执行当前页面的pop操作
       */
      static maybePop(BuildContext context){
        Navigator.of(context).maybePop();
      }
    
    
      ///Page页面的容器,做一次通用自定义
      static Widget pageContainer(widget, BuildContext context) {
        return MediaQuery(
          ///不受系统字体缩放影响
            data: MediaQuery.of(context).copyWith(textScaleFactor: 1),
            child: widget);
      }
    
    
    }

    e.使用

    onTap: () {
       NavigatorUtil.jump(context, "/searchpage");
    },
  • 相关阅读:
    使用Datagrip导入excel数据
    idea2020版本的lombok不能使用
    wait和notify
    死锁的原因
    synchronized关键字
    线程JOIN
    JSON解析精度丢失问题(net.sf.json)
    线程中断
    spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    2、Dubbo源码解析--服务发布原理(Netty服务暴露)
  • 原文地址:https://www.cnblogs.com/lude1994/p/15248839.html
Copyright © 2011-2022 走看看