Coder Social home page Coder Social logo

annotation_route's Introduction

annotation_route

Description

a router config mapping solution based on source_gen through annotation

Usage

  1. Notice: your page should own a constuctor that can be initialized with unique param, then Annotate the page class with @ARoute
    example:

    @ARoute(url: 'myapp://pagea')
    class A {
     A(MyRouteOption option): super();
    }
  2. Annotate your own router class with @ARouteRoot
    example:

    @ARouteRoot()
    class MyRouter {}
  3. run the build_annotation_route.sh in your workspace Or just run the command below in your workspace
    build:

     flutter packages pub run build_runner build --delete-conflicting-outputs

    suggest you running the clean command before build:
    clean:

     flutter packages pub run build_runner clean
  4. now you can get the instance
    example:

    @ARouteRoot()
    class Router {
     ARouterInternal internal = ARouterInternalImpl();
     dynamic getPage(MyRouteOption option) {
       return internal.findPage(
           ARouteOption(option.urlpattern, option.params), option);
     }
    }
    
    class MyRouteOption {
     String urlpattern;
     Map<String, dynamic> params;
    }
  5. examples placed in 'lib/example/*'

Installation

install from packages

add packages to dev_dependencies in your pubspec.yaml
example:

dev_dependencies:
  annotation_route: any

install from source code

clone the code, then put it into your workspace, announce it in your pubspec.yaml exxample:

dev_dependencies:
  annotation_route:
    path: annotation_route

简介

一个以注解方式实现的路由映射解决方案,基于 source_gen

使用

  1. 注意: 你的页面应该实现指定的构造器,一个接受唯一参数的构造器,然后使用@ARoute 注解你的页面类
    例:

    @ARoute(url: 'myapp://pagea')
    class A {
     A(MyRouteOption option): super();
    }
  2. 使用 @ARouteRoot 注解 你自己的 router 类 例:

    @ARouteRoot()
    class MyRouter {}
  3. 在你的工作目录下运行 build_annotation_route.sh 脚本,或者运行如下命令:
    build:

     flutter packages pub run build_runner build --delete-conflicting-outputs

    建议在执行 build 命令前,先执行如下命令:
    clean:

     flutter packages pub run build_runner clean
  4. 现在你可以使用它来获取类的实例了
    例:

    @ARouteRoot()
    class Router {
     ARouterInternal internal = ARouterInternalImpl();
     dynamic getPage(MyRouteOption option) {
       return internal.findPage(
           ARouteOption(option.urlpattern, option.params), option);
     }
    }
    
    class MyRouteOption {
     String urlpattern;
     Map<String, dynamic> params;
    }
  5. 具体代码可以参考 lib/example/*下的文件

安装

从 pub 安装

在你的 pubspec.yaml 文件下声明
例:

dev_dependencies:
  annotation_route: any

从源码安装

拷贝代码至你的工作目录,在你的 pubspec.yaml 文件下声明
例:

dev_dependencies:
  annotation_route:
    path: annotation_route

annotation_route's People

Contributors

voicewitness avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

annotation_route's Issues

How to use this plugin as route?

when I write as follows:
Navigator.pushNamed(context, 'myapp://pagea');

but, it throws an exception:
[ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Could not find a generator for route RouteSettings("myapp://pagea", null) in the _WidgetsAppState.

what's the wrong?

执行命令失败

我不太清楚flutter命令
执行: flutter packages pub run build_runner build --delete-conflicting-outputs 命令错误提示如下
Could not find package "build_runner". Did you forget to add a dependency?

更新 ARouterInternalImpl 的时候出现错误异常

存在这样一个情况:
新增的页面加上@aroute注解后,重新执行 flutter packages pub run build_runner build,原来在ARouterInternalImpl中innerRouterMap添加上的内容会被新增内容替换。

以demo为例,如果复制page_a.dart,并将其重命名为page_e.dart,修改其中的class A,将其改为Class E,之后再执行 flutter packages pub run build_runner build,ARouterInternalImpl(也就是自动生成的那个文件)其中的 innerRouterMap 会发生下文所示的变化:

执行flutter packages pub run build_runner build 前:
final Map<String, List<Map<String, dynamic>>> innerRouterMap = <String, List<Map<String, dynamic>>>{ 'myapp://pagea': [ {'clazz': A} ], 'myapp://pageb': [ {'clazz': B, 'params': '{"parama":"b"}'} ], 'myapp://pagec': [ {'clazz': C} ], 'myapp://pagec_alias': [ {'clazz': C} ], 'myapp://paged': [ {'clazz': D, 'params': '{"parama":"d"}'} ] };

执行之后:

final Map<String, List<Map<String, dynamic>>> innerRouterMap = <String, List<Map<String, dynamic>>>{ 'myapp://pagee': [ {'clazz': E} ] };
同理,instanceFromClazz 方法也是发生了一个现象

按照正常逻辑,添加一个class E,map中的内容应该是添加而不是替换,这块是什么原因导致的呢?

另外,如果随便修改write.dart 的内容,比如说加一句print,或者修改build.yaml,执行一次再改回去执行,就可以正常输出所有使用@aroute注解的类。就像是之前缓存清空了,所以重新扫描执行了一样

最好是aroute那样用法

最好是aroute那样用法 ,页面路由最大好处是解除依赖。
用法能不能更脑残易用一些吗?

Params 是页面传值的作用吗?

生成的 *.internal.dart 中的 findPageConfig 方法里,有一段是对比 params 的值是否一致的处理,如果是传值作用的话,应该判断字段名是否一至吧。

...
            final Function matchParams = (String k, dynamic v) {
              if (params[k] != option?.params[k]) {
                match = false;
                print('not match:A${params[k]}:A${option?.params[k]}');
              }
            };
...

感觉我的使用姿势不对,看例子也没看出个所以然。
可否写个传参数以及获取参数值的具体例子?

Page散落在不同的package或plugin中,如何通过注解实现统一的页面路由?

目前我们的项目中有多个plugin和package,各自包含若干page。想实现统一的路由导航机制,既满足壳工程页面跳转到子模块页面、也满足子模块之间的页面相互跳转。如果要实现这种效果,关键问题在于,如何通过根项目递归地扫描所有依赖的子项目代码注解,然后生成项目级的完整映射表。其中还需要解决可能存在的类名冲突。source_gen貌似只能扫描当前项目lib目录下的代码,无法满足需求。近期是否有计划做类似的功能实现?

如何调用flutter的poputils方法

现在调用poputil方法需要传flutter那种预定义的路由名称跳转方式怎么整?在线等,项目已经准备用这个框架了。。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.