1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網營銷解決方案
      Flutter利用注解生成可自定義的路由的實現(xiàn)

      route_generator是什么

      創(chuàng)新互聯(lián)公司10多年成都定制網頁設計服務;為您提供網站建設,網站制作,網頁設計及高端網站定制服務,成都定制網頁設計及推廣,對房屋鑒定等多個方面擁有豐富的網站運維經驗的網站建設公司。

      這是一個簡單的 Flutter 路由生成庫,只需要少量的代碼,然后利用注解配合源代碼生成,自動生成路由表,省去手工管理路由代碼的煩惱。

      特性

      • 自定義路由名稱
      • 自定義路由動畫
      • 自定義路由參數(shù)
      • 自定義路由邏輯

      依賴

      dependencies:
       # Your other regular dependencies here
       route_annotation: ^0.1.0
      
      dev_dependencies:
       # Your other dev_dependencies here
       build_runner: ^1.5.0
       route_generator: ^0.1.2
      
      

      生成代碼

      單次構建

      在項目根目錄中運行flutter pub run build_runner build,可以在需要時為項目生成路由代碼。這會觸發(fā)一次性構建,該構建遍歷源文件,選擇相關文件,并為它們生成必要的路由代碼。雖然這很方便,但如果您不必每次在模型類中進行更改時都必須手動構建,那么你可以選擇持續(xù)構建。

      持續(xù)構建

      在項目根目錄中運行flutter pub run build_runner watch來啟動watcher,它可以使我們的源代碼生成過程更加方便。它會監(jiān)視項目文件中的更改,并在需要時自動構建必要的文件。

      route_annotation

      annotationdescription
      Router此注解用來標志某個為 Flutter App 的類,并以此生成相應的路由代碼
      RoutePage此注解用來注解一個路由頁面
      RouteParameter一個用來標志頁面參數(shù)的注解,只為可選參數(shù)設計。用于 RoutePage 。
      RouteField此注解用來標志一個完全自定義的路由,被注解的對象必須作為路由頁面類靜態(tài)字段
      PageRouteBuilderFuntcion這個注解用來標識一個路由頁面的 RouteFactory 靜態(tài)方法
      RoutePageBuilderFunction這個注解用來標識一個路由頁面的 RoutePageBuilder靜態(tài)方法
      RouteTransitionBuilderFunction這個注解用來標識一個路由頁面的 TransitionBuilder 靜態(tài)方法
      RouteTransitionDurationField這個注解用來標識一個自定義路由頁面的過渡時長

      代碼示例

      定義路由 App

      @Router()
      class DemoApp extends StatefulWidget {
       @override
       _DemoAppState createState() => _DemoAppState();
      }
      
      class _DemoAppState extends State {
       @override
       Widget build(BuildContext context) {
        return MaterialApp(
         initialRoute: "/",
         onGenerateRoute: onGenerateRoute,
        );
       }
      }
      
      

      定義路由頁面

      // isInitialRoute為true表示它將作為initial page
      @RoutePage(isInitialRoute: true)
      class HomePage extends StatelessWidget {
       @override
       Widget build(BuildContext context) {
        return Scaffold();
       }
      }
      

      定義路由頁面參數(shù)

      對于單個參數(shù)

      @RoutePage(params: [RouteParameter("title")])
      class OneArgumentPage extends StatelessWidget {
       final String title;
      
       const OneArgumentPage({Key key, this.title}) : super(key: key);
      
       @override
       Widget build(BuildContext context) {
        return Container();
       }
      }
      
      

      導航

      Navigator.of(context).pushNamed(
       ROUTE_ONE_ARGUMENT_PAGE,
       arguments: "title is empty",
      );
      

      注意事項:

      對于單個參數(shù)的路由,利用Navigator進行導航的時候arguments即為原始參數(shù)。

      對于多個參數(shù)

      @RoutePage(params: [RouteParameter("title"), RouteParameter("subTitle")])
      class TwoArgumentPage extends StatelessWidget {
       final String title;
       final String subTitle;
      
       TwoArgumentPage({this.title, Key key, this.subTitle}) : super(key: key);
      
       @override
       Widget build(BuildContext context) {
        return Scaffold();
       }
      }
      
      

      導航

      Navigator.of(context).pushNamed(
       ROUTE_TWO_ARGUMENT_PAGE,
       arguments: {
        "title": _titleController.text.isNotEmpty
          ? _titleController.text
          : "title is empty",
        "subTitle": _subTitleController.text.isNotEmpty
          ? _subTitleController.text
          : "sub title is empty",
       },
      );
      

      注意事項:

      對于多個參數(shù)的路由,利用Navigator進行導航的時候arguments必須為Map

      如果你不需要自定義路由,以下部分,你可以什么都不用添加,就讓route_generator為你自動生成相關代碼吧!

      自定義路由(優(yōu)先級:3)

      這種方法自定義路由的優(yōu)先級最高,如果同時存在多種自定義路由選擇,該種方案最先被選擇。

      @RoutePage()
      class CustomRoutePage extends StatelessWidget {
       @RouteField()
       static Map route = {
        'custom_route': (RouteSettings settings) =>
          MaterialPageRoute(builder: (BuildContext context) => CustomRoutePage()),
        'alias_route': (RouteSettings settings) => PageRouteBuilder(
           pageBuilder: (BuildContext context, Animation animation,
               Animation secondaryAnimation) =>
             CustomRoutePage(),
          ),
       };
      
       ...
      
      }
      
      

      它會生成如下代碼:

      Map _customRoutePage = CustomRoutePage.route;

      自定義路由(優(yōu)先級:2)

      這種方法自定義路由的優(yōu)先級較低,如果同時存在多種自定義路由選擇,則按優(yōu)先級從大到小選擇。

      @RoutePage()
      class CustomRoutePage extends StatelessWidget {
       @PageRouteBuilderFuntcion()
       static Route buildPageRoute(RouteSettings settings) => PageRouteBuilder(
          pageBuilder: (BuildContext context, Animation animation,
              Animation secondaryAnimation) =>
            CustomRoutePage(),
         );
      
       ...
      
      }
      
      

      它會生成如下代碼:

      Map _customRoutePage = {
       'custom_route_page': CustomRoutePage.buildPageRoute,
      };
      

      自定義路由(優(yōu)先級:1)

      這種方法自定義路由的優(yōu)先級最低,如果同時存在多種自定義路由選擇,則按優(yōu)先級從大到小選擇。

      @RoutePage()
      class CustomRoutePage extends StatelessWidget {
       // RoutePageBuilderFunction注解表明這個方法用來定義如何返回RoutePage
       // 它是可選的
       @RoutePageBuilderFunction()
       static Widget buildPage(BuildContext context, Animation animation,
           Animation secondaryAnimation, RouteSettings settings) =>
         CustomRoutePage();
      
       // RouteTransitionBuilderFunction注解表明這個方法用來定義如何應用動畫過渡
       // 它是可選的
       @RouteTransitionBuilderFunction()
       static Widget buildTransitions(
           BuildContext context,
           Animation animation,
           Animation secondaryAnimation,
           Widget child,
           RouteSettings settings) =>
         child;
      
       // RouteTransitionDurationField注解表明這個字段用來定義頁面過渡時常長,默認值為300 milliseconds
       // 它是可選的
       @RouteTransitionDurationField()
       static Duration transitionDuration = Duration(milliseconds: 400);
      
       ...
      
      }
      
      

      它會生成如下代碼:

      Map _customRoutePage = {
       'custom_route_page': (RouteSettings settings) => PageRouteBuilder(
          pageBuilder: (context, animation, secondaryAnimation) =>
            CustomRoutePage(),
          transitionsBuilder: (context, animation, secondaryAnimation, child) =>
            CustomRoutePage.buildTransitions(
              context, animation, secondaryAnimation, child, settings),
          transitionDuration: CustomRoutePage.transitionDuration,
         ),
      };
      

      注意事項

      • 只允許有一個initalRoute
      • initalRoute會忽略自定義路由名,但會生成名為ROUTE_HOME的路由名稱常量。
      • 所有自定義路由method或getter必須定義在路由所在類,且必須為static所修飾的和非私有的。

      最終生成代碼

      最終生成的文件名為FILENAME.route.dart

      其中FILENAME是被Router注解的App類所在的文件名。

      // GENERATED CODE - DO NOT MODIFY BY HAND
      
      // **************************************************************************
      // RouteGenerator
      // **************************************************************************
      
      import 'package:flutter/material.dart';
      import 'home_page.dart';
      import 'custom_route_page.dart';
      import 'custom_route_name_page.dart';
      import 'second_page.dart';
      import 'one_arguement_page.dart';
      import 'two_arguement_page.dart';
      
      const ROUTE_HOME = '/';
      const ROUTE_CUSTOM_ROUTE_PAGE = 'custom_route_page';
      const ROUTE_CUSTOM = 'custom';
      const ROUTE_SECOND_PAGE = 'second_page';
      const ROUTE_ONE_ARGUMENT_PAGE = 'one_argument_page';
      const ROUTE_TWO_ARGUMENT_PAGE = 'two_argument_page';
      
      RouteFactory onGenerateRoute = (settings) => Map.fromEntries([
         ..._home.entries,
         ..._customRoutePage.entries,
         ..._custom.entries,
         ..._secondPage.entries,
         ..._oneArgumentPage.entries,
         ..._twoArgumentPage.entries,
        ])[settings.name](settings);
      
      Map _home = {
       '/': (RouteSettings settings) => MaterialPageRoute(
          builder: (BuildContext context) => HomePage(),
         ),
      };
      Map _customRoutePage = {
       'custom_route_page': (RouteSettings settings) => PageRouteBuilder(
          pageBuilder: (context, animation, secondaryAnimation) =>
            CustomRoutePage.buildPage(
              context, animation, secondaryAnimation, settings),
          transitionsBuilder: (context, animation, secondaryAnimation, child) =>
            CustomRoutePage.buildTransitions(
              context, animation, secondaryAnimation, child, settings),
          transitionDuration: CustomRoutePage.transitionDuration,
         ),
      };
      Map _custom = {
       'custom': (RouteSettings settings) => MaterialPageRoute(
          builder: (BuildContext context) => CustomRoutePageName(),
         ),
      };
      Map _secondPage = {
       'second_page': (RouteSettings settings) => MaterialPageRoute(
          builder: (BuildContext context) => SecondPage(),
         ),
      };
      Map _oneArgumentPage = {
       'one_argument_page': (RouteSettings settings) => MaterialPageRoute(
          builder: (BuildContext context) =>
            OneArgumentPage(title: settings.arguments),
         ),
      };
      Map _twoArgumentPage = {
       'two_argument_page': (RouteSettings settings) => MaterialPageRoute(
          builder: (BuildContext context) => TwoArgumentPage(
             title: (settings.arguments as Map)['title'],
             subTitle:
               (settings.arguments as Map)['subTitle'],
            ),
         ),
      };
      

      常見問題

      沒有生成路由文件

      請檢查是否添加了Router注解

      Example

      獲取更詳細信息,請參閱example

      以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


      網站標題:Flutter利用注解生成可自定義的路由的實現(xiàn)
      網站路徑:http://www.ef60e0e.cn/article/pgjjid.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        白朗县| 揭东县| 利津县| 全椒县| 石门县| 小金县| 灌阳县| 理塘县| 白山市| 淄博市| 迁安市| 霍邱县| 商丘市| 九龙县| 措勤县| 兴义市| 凉山| 五家渠市| 德州市| 铁力市| 丽水市| 那曲县| 汕头市| 千阳县| 清远市| 内乡县| 法库县| 惠东县| 商水县| 张家口市| 论坛| 阿勒泰市| 福海县| 康定县| 攀枝花市| 确山县| 黑水县| 漾濞| 烟台市| 邮箱| 静乐县|