A zero-dependency web framework for writing web apps in plain Dart.

Overview

Rad

Rad is a frontend framework for creating fast and interactive web apps using Dart. It's inspired from Flutter and shares same programming paradigm. It has all the best bits of Flutter(StatefulWidgets, Builders) and allows you to use web technologies(HTML and CSS) in your app.

Quick links

Let's start

Below is a hello world in Rad:

class HomePage extends StatelessWidget
{
  @override
  Widget build(BuildContext context) {
    return Text("hello world");
  }
}

If you're familiar with Flutter it don't even need an explanation. It has some differences that might not be apparent from the example so let's discuss them first.

Differences

  1. First off, we don't use a rendering engine to render a widget or anything like that. Widgets are mapped to HTML tags and composed together they way you describe them.

  2. Rad's won't be rebuilding your widgets multiple times a second, which means for animations you've to turn to CSS.

  3. Lastly, for designing UIs, you've to use HTML. And guess what? there are widgets for that.

    Let's take this HTML snippet:

    <span class="heading big">
      <strong>
        hellow
      </strong>
    </span>

    Here's how its equivalent will be written using widgets:

    Span(
      classAttribute: "heading big",
      children: [
        Strong(innerText: "hellow"),
      ],
    );

    Talking more about UI, there are no layout/style specific widgets like you've Container and Stack widgets in Flutter. We don't really need them as most of things can be done using HTML and CSS.

    Just for the sake of example, let's say you want a Stack widget,

    1. Create a function Stack entry:
      Widget StackEntry(Widget widget)
      {
        return Division( 
            style: "position:absolute;top:0;left:0;",
            children: [widget],
          );
      
        // Division = HTML's div
      }
    2. Create a function Stack:
      Widget Stack({required List<Widget> children})
      {
        return Division(
            style: "position:relative;",
            children: children,
          );
      }
    3. That's it! here's our newly created Stack widget
      Stack(
        children: [
          StackEntry(Text("hellow 1")),
          StackEntry(Text("hellow 2")),
        ]
      )

    This was just an example, you don't really need these type of widgets since now you can use a CSS framework of your choice. Note that, in above example, Stack is actually a function that returns a widget. In later part of this readme, we'll show you how you can create a actual widget out of it.

Flutter widgets

Following widgets in Rad are inspired from Flutter:

  • StatelessWidget, StatefulWidget, InheritedWidget.
  • FutureBuilder, StreamBuilder and ValueListenableBuilder.

These widgets has same syntax as their Flutter's counterparts. Not just syntax, they also works exactly same as if they would in Flutter. Which means you don't have to learn anything new to be able to use them.

HTML widgets

There are two important characteristics of HTML widgets that we'd like to talk about:

1. HTML widgets are composable

Just like other widgets, HTML widgets are composable and has same semantics in the sense that they can be composed and mixed together with other widgets. For example,

Span(
  child: ListView(
    children: [
      SomeStatefulWidget(),
      Span(),
      ...
    ]
  ),
);

In above example, a Span widget is containing a ListView widget. Further, that ListView is containing a StatefulWidget and a Span widget. The point we're trying to make is that HTML widgets won't restrict you to 'just HTML'. You can mix HTML widgets with other widgets.

2. HTML widgets are extendable

Designing and re-using UIs is a common requirement of every project. HTML widgets are flexible enough that you can use them to create your own widgets and re-usable UIs.

Let's finish our Stack example by creating a actual Stack widget. Here's the StackEntry function that we created earlier:

Widget StackEntry(Widget widget)
{
  return Division( 
    style: "position:absolute;top:0;left:0;",
    children: [widget],
  );
}

We can unwrap it by extending the Division widget:

class StackEntry extends Division
{
  const StackEntry(Widget widget): super( 
    style: "position:absolute;top:0;left:0;",
    children: [widget],
  );
}

Let's do the same with Stack container function:

// from

Widget Stack({required List<Widget> children})
{
  return Division(
      style: "position:relative;",
      children: children,
    );
}

// to

class Stack extends Division
{
  const Stack({required List<Stack> children}): super( 
    style: "position:relative;",
    children: children,
  );
}

That's pretty much it. This might not look like a big improvement at first but we've actually created a brand new HTML widget that has its own identity and semantics. Unlike other frameworks where you'd create a component by implementing bunch of methods, in Rad you can extend widgets to create new widgets.

FAQ

Can we use Rad for creating a static website?

Yes.

Can we use Rad for creating a dynamic website?

Yes, that's something this framework is good at.

Can we use Rad for creating a single page application/or a web app?

Yes, that'll be perfect. Rad has widgets with powerful mechanics for dealing with nested routing, deep linking, history and state management.

Is it SEO friendly?

Rad is a frontend framework and server side rendering is a must for better SEOs. Some frontend frameworks provides SSR but unfortunately we don't have that at the moment. However you can use a backend technology(PHP, Node, Erlang etc.) to stuff meta information in your root page, based on location that a client requested, before serving the page to client. We assure you that this is a sane, simple, and effective approach

Widgets Index

Below is the list of available widgets in this framework.

Some widgets are named after Flutter widgets because they either works exactly same or can be used to acheive same things but in a differnet way(more or less). All those widgets are marked according to their similarity level.

Markings:

  • exact: Exact syntax, similar semantics.
  • same: Exact syntax with few exceptions, similar semantics.
  • different: Different syntax, different semantics.
  • experimental: --

Please note that these markings are based solely on my understanding of Flutter widgets/src. If you happen to find any big differences, do let me know.

Abstract

Navigator/Routing

Builders

Misc

HTML Widgets

Anchor , Blockquote , BreakLine , Button , Canvas , Division , FieldSet , Footer , Form , Header , Heading(1-6) , HorizontalRule , IFrame , Idiomatic , Image , InputCheckBox , InputFile , InputRadio , InputSubmit , InputText , Label , Legend , ListItem , Navigation , Option , Paragraph , Progress , Select , Small , Span , Strong , SubScript , SuperScript , TextArea , UnOrderedList

Contributing

For reporting bugs/queries, feel free to open issue. Read contributing guide for more.

Comments
  • Add support for Hooks

    Add support for Hooks

    Description

    This pull request is about adding support for hooks, a feature similar to React Hooks.

    I won't go into details, feel free to check react docs on hooks for following along.

    Primary goal of this pull request is to provide a standard interface for hooks which users can use to create their own hooks. Of course we'll provide few hooks as an example but our focus is more on facilitating easy yet powerful hook implementations that can be created externally.

    Hooks

    First things first,

    A FunctionWidget/WidgetFunction is a function that returns a widget:

    Widget widgetFunction() {
      return Span(
          child: Text('hello world'),
        );
    }
    
    runApp(app: widgetFunction(), ...);
    

    Functions as such are stateless and yeild same output everytime they get called.

    Hooks can powerup these functions by letting you use state and other features inside functions.

    Implementation

    I've tried couple of ways:

    Method 1(with context + a wrapper widget)

    Widget widgetFunction() => HooksWrapperWidget((context) {
      var state = context.useState(0);
    
      return Span(
        child: Text('You clicked me ${state.value} time!'),
        onClick: (_) => state.value++,
      ); 
    });
    
    runApp(app: widgetFunction(), ...);
    

    This is without a doubt, the most reliable and safest way one can use hooks.

    While this is safe it suffers from other problems. Here hooks are tightly coupled with the context and this limits them to whatever a particular context is limited to. Users who will be using hooks probably looking for something easy to reuse and extend even if it takes away few guarantees so let's see a little bit unsafe method:

    Method 2

    Widget widgetFunction() => HookScope(() {
      var state = useState(0);
    
      return Span(
        child: Text('You clicked me ${state.value} time!'),
        onClick: (_) => state.value++,
      ); 
    });
    
    runApp(app: widgetFunction(), ...);
    

    This is what we're going to implement. Here, both HookScope and useState are not tied with each other and can be implemented independently, which basically means,

    • Users can easily implement their own hooks.
    • Users can easily use hooks implemented by the others.

    How this works?

    Similar to React, we'll rely on the order in which hooks are executed.

    This puts few responsibilities on the users:

    1. Users should always wrap their WidgetFunction in HookScope.
    2. Users should not call Hooks inside loops, conditions, or nested functions.
    3. Users should use Hooks at the top level of their functions, before any widget/or early return.

    We'll try to throw errors or warn users where we can but just know that these rules applies to React as well(read more).

    Progress

    I've already got a prototype working. I'll outline a slightly different implementation(that of course can change):

    • [x] Add hook and scope interface
    • [x] Add dispatcher methods
    • [x] Add a standard implementation for scope(HookScope)

    Rad Hooks

    • [x] Add useContext
    • [x] Add useNavigator

    React Hooks

    • [x] Add useRef
    • [x] Add useState
    • [x] Add useEffect
    • [x] Add useLayoutEffect
    • [x] Add useMemo and useCallback

    Benchmark results

    Hopefully we won't be making any changes to core/existing-widgets so there will be no need.

    opened by hamsbrar 11
  • Rendering interface for Component libraries and shared logic in Dart web rendering frameworks

    Rendering interface for Component libraries and shared logic in Dart web rendering frameworks

    Hi, thanks for you work!

    I have been building the web bootstrap components bindings in this repo. At the moment it supports three different frameworks: deact, jaspr and rad. I have implemented bindings for each of the frameworks separately in different packages. You can view all the implemented bootstrap components in the deployed page, that page renders the components with package:deact. Another deact example is this one and a jaspr example is this one. At the moment, I have not implemented any rad examples.

    Maybe it would be nice to collaborate on a shared interface between the Dart web frameworks, perhaps something similar to what bootstrap_dart is doing, but where the libraries implement them natively. You can view the Dart interface in the readme of the repo.

    Perhaps a "web_rendering_interface" package that exposes interfaces like Ref, State, BuildContext, Component, some base hooks, and the ability to render HTML elements, text nodes and fragments (List of Components) could be used. The rendering packages (deact, jaspr or rad) implement these interfaces and the component packages (or logic packages such as for hooks or routing) use those interfaces.

    At the moment, bootstrap_dart uses a global BoostrapRenderer instance that has to be overridden to use the renderer for each package like this example that executes this function. The returned components are of type dynamic, which works, but maybe isn't great. BoostrapRenderer has a generic type parameter for the component type which could be used to improve type safety. For type safety, the BoostrapRenderer in the repo could use extensions to implement the components and the BoostrapRenderer instance could be used directly (boostrapRenderer.card(...) to return a Card bootstrap component). The extensions would need to be imported since they contain the implementation for each component. Or perhaps we could expose a Component interface in "web_rendering_interface" so that the component libraries return an instance of that interface. Or reimplement each component in all the packages that interface the rendering framework with the component libraries, perhaps with code generation to maintain documentation and the API synched.

    This would allow for the component libraries to use the same code and interface with multiple different rendering libraries. As well as perhaps share hooks between different frameworks. This could also be extended to other functionalities like server side rendering, routing or dependency injection. Where the routing logic could be used for every rendering package.

    Thanks for reading!

    opened by juancastillo0 6
  • Some feedback - my initial thoughts

    Some feedback - my initial thoughts

    I dag into what you did here and overall, I really like some of the things I see. With my appreciation to the effort you put into making this happen, there are some areas that I think could benefit from a bit more attentive coding love :)

    GJ, so far, I hope you keep on going!

    Statics - testability - multiple apps

    1. _registeredWidgetObjects is static in framework.dart - multiple instances an app is a no-go?
      • you are protecting against multiple FW instances with checking _isInit value
      • An app should probably run in its own zone to make sure that errors from one doesn't break others, in case you enable multiple app to run on the same page (there are some nice use-cases for this)
      • Maybe, a similar "bootstrapping" mechanism can be used as seen in Flutter runApp(RadApp, someOptions) to init logging, debug tooling, zones, etc.
    2. statics effectively prevent tests to mock out pieces of the FW - make it very tedious

    Navigator and routes

    This is tough one. Angular didn't get it right the first time, nor did Flutter. No surprises here :)

    1. window.addEventListener("popstate" could be written as window.onPopState.listen
      • listeners should be disposed when app is disposed
    2. Navigator doesn't seem to react to manual command in console history.pushState({}, '', 'another')
      • this prevents being able to react to external changes, maybe 3rd party libraries
    3. In local development, using path based routing is cumbersome. In debug mode, it should be permissible to use hash routes. eg. localhost:8080/#/home
    4. sitemap is still a thing, there should be a mechanism in place to extract route information
      • one thing that pops into mind is compile time const expressions for routes
    5. Routes should be allowed to be loaded async with deffered as import statements
      • AsyncRoute subclass maybe?
      • or maybe instead of page, there could be a AsyncWidgetBuilder callback for the Route with FutureOr return value?
    6. There is a seemingly arbitrary restriction what a path might look like for a Route: RegExp(r'^[a-zA-Z0-9_]+$'). Is there a reason for this?
      • with that routes such as this would be not possible /blog/some-blog-entry-title-sanitized'
    7. Is there a way to capture paths as params to a Route? eg. /blog/:slug:

    Events and event handling

    I noticed that there isn't really a consistent handling of events across the widgets. Most, if not all, have an onClickEventListener and there is GestureDetector widget. There are important use-cases that I can't cover with these 2.

    There is one workaround I found: using a stateful widget where I get to access the DOM element from initState and go underneath the FW.

      late StreamSubscription sub;
    
      void initState() {
        sub = element.onMouseEnter.listen((event) {
          print('${(event.currentTarget! as Element).text}');
        });
      }
    
      void dispose() {
        sub.cancel();
      }
    

    While this works, it feels out of place. A way to automagically handle stream subscriptions and their disposals would be beneficial.

    Maybe something along these lines?

    class MouseEnterSample extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Handle(
          events: {
            'mouseEnter': enterHandler,
            'my-custom-event', customHandler,
          },
          child: MyButton,
        );
      }
    }
    
    multiple features 
    opened by daniel-v 5
  • InputText.value is not set when an empty String is used

    InputText.value is not set when an empty String is used

    Hi, thanks for your work!

    I found that when I pass an empty String to the InputText widget constructor, the text is not cleared. The value of the element is not overridden. Should I save the dart:html.InputElement reference to clear and update the value, like a Flutter TextEditingController?

    I was also wondering whether a void Function(String value) onValueChange argument in the constructor could be used as API, maybe the same for others where we know the Dart type such as number or date inputs. At the moment I was casting the event target to dart:html.InputElement and accessing the value from that. However, for InputText and others we know the element and type of input (and Dart's value type).

    The full code that I was testing is in this file.

    Thanks again!

    bug 
    opened by juancastillo0 4
  • How to define the value of a TextArea widget?

    How to define the value of a TextArea widget?

    In my app I would like to give the output of a calculation as a longer Text in a readonly TextArea, so that it is easy to select and copy the content. But I find no way to define a value in the TextArea constructor:

    TextArea(
                placeholder: 'Dart output',
                readOnly: true,
                maxLength: 9999,
                classAttribute: 'w-full h-96 border mt-4 p-2',
                innerText: outputVariable,
              )
    

    I can only define the innerText but this is not the value. I can access the TextArea with document.getElementById and then change the value property but after a setState this is lost.

    enhancement 
    opened by krillefear 4
  • Use Iterable<String> classes instead of a String classAttributes

    Use Iterable classes instead of a String classAttributes

    For HTML Widgets we can define classes in Rad by using the classAttributes. This maps to the classNames attribute of HtmlElements in dart:html. But in HtmlElements we also have the classes parameter where we can use an Iterable. By using a Set there we have some advantages:

    The list of class is easier to read. Especially when using tailwindCSS we will have much cleaner code.

    Compare:

    class EmptyView extends StatelessWidget {
      final String text;
    
      EmptyView({required this.text});
    
      @override
      Widget build(context) {
        return Division(
          classAttribute: 'w-full h-full justify-center items-center flex',
          children: [
            Division(
              classAttribute: 'p-4 text-center text-sm text-gray-600',
              innerText: text,
            )
          ],
        );
      }
    }
    

    To:

    import 'dart:html';
    
    import 'package:rad/rad.dart';
    import 'package:rad/widgets_html.dart';
    
    class EmptyView extends StatelessWidget {
      final String text;
    
      EmptyView({required this.text});
    
      @override
      Widget build(context) {
        return Division(
          classes: {
            'w-full',
            'h-full',
            'justify-center',
            'items-center',
            'flex',
          },
          children: [
            Division(
              classes: {
                'p-4',
                'text-center',
                'text-sm',
                'text-gray-600',
              },
              innerText: text,
            )
          ],
        );
      }
    }
    
    

    Also by using Sets we make sure that we can't pass the same class multiple times.

    Proposal: We could replace String classAttribute with Iterable<String> classes or we add classes as an additional attribute and define what happens if the user uses both.

    add-on feature 
    opened by krillefear 4
  • Can't access `dart:html.KeyboardEvent` from EmittedEvent

    Can't access `dart:html.KeyboardEvent` from EmittedEvent

    Hi, At the moment the problem I was having (shown here) was accessing the exact key pressed in a InputText to send a message when the user presses the "Enter" key. I was wondering whether there is a way to access the inner _rawEvent or perhaps other API for accessing the dart:html event. Or maybe I could not find it in the docs and code?

    Thank you for your work!

    enhancement 
    opened by juancastillo0 2
  • Good job. I liked the implementation. But there are often typos.

    Good job. I liked the implementation. But there are often typos.

    Everything works very clearly.
    But the typos hurt the eyes. I recently installed (in vscode) an add-on and it shows all the typos.

    Eg.

    lM4ZFdJi

    f82v3JQI

    P.S. I use Code Spell Checker But this only works in files opened in the editor.

    enhancement 
    opened by mezoni 2
  • Optimize rendering & dispose(s)

    Optimize rendering & dispose(s)

    This pull request contains:

    1. RenderEvents, a event system for RenderElements.
    2. Couple of optimizations, major one being the ability to short-circuit dispose(s) using RenderEvents.

    Render events

    RenderEvents are the events that framework will emit when it interacts with a RenderElement. Just like we can add event listeners for user interactions on DOM elements, we can now add event listeners for framework interactions on RenderElements. Similar to DOM events, we've different types of RenderEvents for different types of interactions which are listed below:

    • didRender is a event that's emitted after framework finishes rendering the output of render to the DOM.
    • didUpdate is a event that's emitted after framework finishes rendering the output of update to the DOM.
    • willUnMount is a event that's emitted when framework is about to remove the widget from the DOM.
    • didUnMount is a event that's emitted after framework finishes removing the widget from the DOM.

    RenderElements can decide to listen to a particular or all render events by adding event listeners.

    Comparing RenderEvents with DOM events, there are few differences & restrictions:

    • RenderEvents do not have capture/bubble phase.
    • RenderEvents are meant to be listened internally inside RenderElements.
    • Listeners for RenderEvents can be attached only during initial render, and cannot be updated.

    These restrictions are temporary and we'll lift them when needed.

    RenderEvents are meant to solve the problem of limited control over lifecycle in RenderElements. Previously we were providing a sub-class WatchfulRenderElement with hardcoded lifecycle. Now, using the new RenderEvents API, users can add as much or as little lifecycle as they want, to any RenderElement(widget). This new API effectively makes WatchfulRenderElement obsolete(but we'll keep it for backward compatibility).

    Benchmark results

    opened by hamsbrar 1
  • Support for static site generation

    Support for static site generation

    I just tried this package and I love it! It seems like a great alternative to https://github.com/schultek/jaspr (both project have their pros and cons of course)

    However, it would be great to have support for static site generation in Rad, to be able to generate static html pages from my dart code.

    opened by flexagoon 1
  • Add Refs to HTML widgets

    Add Refs to HTML widgets

    Description

    This pull request is about adding Refs support in Rad's HTML widgets.

    Providing 'a declarative way' for everything sounds great but hard to accomplish. There are number of cases where users simply want the framework to get out of their way. We already provide few escape hatches like RawMarkUp widget but sometimes users want to access DOM elements that are associated with HTML widgets. Rather than forcing users to go underneath the framework ( document.getElementById ), we should provide a much easy and predictable way i.e Refs.

    This feature is similar to React's Refs but with few differences:

    • Only callback Refs, no legacy string/createRef APIs.
    • Only on HTML widgets(we want refs to be a feature of widget not framework)

    Progress

    Update: With the support for RenderEvents(v1.2.0), we can add Refs without adjusting anything in the core.

    • [x] Implement Refs in HTML base widget.
    • [x] Add ref property to all HTML widgets(only HTML widgets, for now).

    Benchmark results

    Updated Benchmark results

    opened by hamsbrar 1
  • Maintenance Update: Router/Navigator

    Maintenance Update: Router/Navigator

    This pull request:

    • Reduces coupling between Navigator widget and Router service.
    • Fixes: Router is incorrectly pushing the Route.name to the address bar instead of the Route.path.
    • Fixes: When NavigatorState.open is called inside Navigator.onInit, it can result in multiple routes being left open.
    opened by hamsbrar 0
Releases(v1.4.0)
  • v1.4.0(Aug 25, 2022)

    Refs, an easy and predictable way for accessing DOM nodes.

    Inspired from Callback-Refs in React, Refs in Rad provides an easy and predictable way to access DOM elements that are associated with Rad widgets. Normally Rad takes cares of creating and updating DOM for you but there are many reasons why you would want to access the actual DOM elements. Common use-cases are managing focus (critical for accessibility) and triggering imperative animations.

    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Aug 14, 2022)

    Hooks, use state and other features inside widget-functions.

    Hooks(inspired by React's Hooks) lets you use state and other features without writing classes(such as StatefulWidget). This release includes few ready-to-use hooks and a easy yet powerful Hooks API that you can use to create your own custom hooks. We've also released a hooks package containing implementations of commonly used React Hooks(see rad_hooks).

    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Aug 5, 2022)

    RenderEvents, a event system for RenderElements.

    RenderEvents are the events that framework will emit when it interacts with a RenderElement. Just like we can add event listeners for user interactions on DOM elements, we can now add event listeners for framework interactions on RenderElements. Similar to DOM events, we've different types of RenderEvents for different types of interactions which are listed below:

    • didRender is a event that's emitted after framework finishes rendering the output of render to the DOM.
    • didUpdate is a event that's emitted after framework finishes rendering the output of update to the DOM.
    • willUnMount is a event that's emitted when framework is about to remove the widget from the DOM.
    • didUnMount is a event that's emitted after framework finishes removing the widget from the DOM.

    RenderElements can decide to listen to a particular or all render events by adding event listeners.

    Comparing RenderEvents with DOM events, there are few differences & restrictions:

    • RenderEvents do not have capture/bubble phase.
    • RenderEvents are meant to be listened internally inside RenderElements.
    • Listeners for RenderEvents can be attached only during initial render, and cannot be updated.

    These restrictions are temporary and we'll lift them when needed.

    RenderEvents are meant to solve the problem of limited control over lifecycle in RenderElements. Previously we were providing a sub-class WatchfulRenderElement with hardcoded lifecycle. Now, using the new RenderEvents API, you can add as much or as little lifecycle as you want, to any RenderElement(widget). This new API effectively makes WatchfulRenderElement obsolete but we'll keep it for backward compatibility at zero-cost(it's also using the new RenderEvents API from now on).

    Bug fixes

    • (Fixed) Renderer reconciling all sibling widgets on dependent updates(sometime disposing siblings because of that).
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Jul 29, 2022)

    Added following lifecycle methods to State:

    • afterMount: Gets called after framework finishes rendering widget to DOM.
    • afterUpdate: Gets called after framework finishes re-rendering widget to DOM.
    • afterUnMount: Gets called after framework finishes removing widget from DOM.

    Added following lifecycle methods to WatchfulRenderElement:

    • afterUpdate: Gets called after framework finishes re-rendering widget to DOM.
    • dispose: Gets called after framework finishes removing widget from render tree and is about to remove it from DOM.

    Others

    Bug fixes

    • (Fixed) InputHidden missing from public API.
    • (Fixed) Value not setting/updating correctly on following Input widgets: InputUrl, InputTime, InputTelephone, InputSearch, InputRange, InputPassword, InputNumber, InputMonth, InputEmail, InputText, InputDateTimeLocal, InputDate and InputColor.
    • (Fixed) WatchfulRenderElement.afterUnMount getting called before framework finishes removing widget from DOM(while it should get called after the complete removal of widget).
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jul 19, 2022)

Owner
is doing something!
null
Backbone - A Dart framework for writing REST APIs from an Open API spec

The Backbone Dart Backend Framework A Dart framework for writing REST APIs from

Marcus Twichel 39 Oct 6, 2022
Lite version of smart_select package, zero dependencies, an easy way to provide a single or multiple choice chips.

Lite version of smart_select package, zero dependencies, an easy way to provide a single or multiple choice chips. What's New in Version 2.x.x Added p

Irfan Vigma Taufik 97 Dec 15, 2022
End to end flutter series for zero to hero flutter devloper.( lang of videos is turkish)

flutter_full_learn A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you start

Veli Bacik 191 Dec 24, 2022
German From Zero To Hero

Having troubles trying to learn Deutsch (German)? I had those too... That's why I made an app that will help you with. You don't need previous knowledge about German or learning languages. What you need is a couple of minutes, lost the fear to talk in front of other in German, and just have fun!

Kevin Arce 6 Dec 8, 2022
Web checkout dependency for stripe

Stripe Checkout For Flutter The quickest way to build conversion-optimized payment forms, hosted on Stripe. final sessionId = await getSessionIdFromMy

Mofidul Islam 3 Jun 2, 2022
Flying Fish is full-stack Dart framework - a semi-opinionated framework for building applications exclusively using Dart and Flutter

Flying Fish is full-stack Dart framework - a semi-opinionated framework for building applications exclusively using Dart and Flutter.

Flutter Fish 3 Dec 27, 2022
A simple dependency injection plugin for Flutter and Dart.

A super simple dependency injection implementation for flutter that behaviours like any normal IOC container and does not rely on mirrors

Jon Samwell 91 Dec 13, 2022
A Dart dependency injection library aimed to be flexible, predictable and easy to use.

dino Dino is a Dart dependency injection library with optional code generation. It was inspired by DI in .NET and aimed to be flexible, predictable an

null 3 Dec 20, 2022
Create dart data classes easily, fast and without writing boilerplate or running code generation.

Dart Data Class Generator Create dart data classes easily, fast and without writing boilerplate or running code generation. Features The generator can

null 186 Feb 28, 2022
Sibyl App written with Dart/Flutter. (My first experience in writing a real android app in flutter).

sibyl_app A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if thi

ALi.w 3 Feb 17, 2022
A thought experiment on writing a strange API for Dart.

Operator Frog ?? What is Operator Frog Operator Frog is a < 24h thought experiment that I did. I wanted to know if we could write a strange looking AP

Jochum van der Ploeg 19 Dec 8, 2022
Intel Corporation 238 Dec 24, 2022
Arisprovider - A mixture between dependency injection (DI) and state management, built with widgets for widgets

A mixture between dependency injection (DI) and state management, built with wid

Behruz Hurramov 1 Jan 9, 2022
MVC pattern for flutter. Works as state management, dependency injection and service locator.

MVC pattern for flutter. Works as state management, dependency injection and service locator. Model View Controller Here's a diagram describing the fl

xamantra 115 Dec 12, 2022
Flutter getx template - A Flutter Template using GetX package for State management, routing and Dependency Injection

Flutter GetX Template (GetX, Dio, MVVM) This Flutter Template using GetX package

Tareq Islam 6 Aug 27, 2022
[Flutter SDK V.2] - Youtube Video is a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.

[Flutter SDK V.2] - Youtube Video is a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.

R. Rifa Fauzi Komara 17 Jan 2, 2023
Clean Architecture + TDD + SOLID + Dependency Injection + GitFlow + Mobx

Clean Architecture + TDD + SOLID + Dependency Injection + GitFlow + Mobx Flutter Interview Challenge This app is part of an interview process. It took

Vinicius Souza 13 Dec 28, 2022
This is Dependency package used for chating system.

This Package will give you a unique and pre-designed chatting system based on Firebase Firestore and Firebase Cloud. It also has Push Notifications an

AppTex Software Solutions 4 Oct 31, 2022
Raden Saleh 20 Aug 12, 2023