Effortless property builder for composing maintainable Flutter UI

Overview

Niku

Effortless property builder for composing maintainable Flutter UI

Niku

Why

Creating UI in Flutter is easy. Its declarative enables developers to control every detail and outcome of how it should be.

To create styling in Flutter, developers have to describe every detail to Widget. It's like low-level programming UI, having to adapt between property is hard when some are more complex than others, for instance, MaterialStateProperty.

When the codebase gets more complex, the syntax of Flutter itself is too verbose, nested than it should be, result being hard to maintain mostly known as "Nested Hell".

Niku helps to solve the problem by providing a toolkit to style widgets with property builders. To provide a smoother, shorter yet, more straightforward and maintainable way to compose styling in Flutter.

Comparison

Documentation

Documentation and getting start can be find on https://niku.saltyaom.com

License

Niku is MIT Licensed.

Maintainers

Comments
  • NikuWrap throws an error when inserting different subtype class into its children.

    NikuWrap throws an error when inserting different subtype class into its children.

    When inserting Widget children through NikuWrap method, TypeErrorImpl will be thrown when the list subtype of NikuWrap constructor doesn't match with the subtype of the inserting child. Although _children property in NikuWrap constructor accepts any inherited Widget subtype.

    Example

    List<NikuColumn> someRandomColumnList = [1, 2, 3, 4].map((e) => NikuColumn(NikuText('$e'))).toList();
    Container randomContainer = Container();
    
    // This will throw an error. Expected a value of type 'NikuColumn', but got one of type 'Container'.
    return NikuWrap(someRandomColumnList).insert(0, randomContainer);
    // This also throw an error.
    return NikuWrap(someRandomColumnList).append(randomContainer);
    
    // But this will not.
    return NIkuWrap(someRandomColumnList);
    // This will not.
    List<Widget> widgetList = someRandomColumnList.map((e) => e.build(context)).toList()
    return NikuWrap(widgetList); // Build NikuColumn into generic `Widget` type first.
    // This also not.
    return NikuWrap(widgetList).append(randomContainer);
    

    This might be an issue with dart forcing typecast into the parent subclass with assigning the _children property.

    opened by y-pakorn 6
  • Bug: conflict with Flutter 3.3.0

    Bug: conflict with Flutter 3.3.0

    bug:

    • flutter pub get niku error with flutter 3.3.0.

    env:

    • ✅ flutter 3.3.0
    • ✅ niku-2.3.2

    The location of the error code:

    • ✅ https://github.com/SaltyAom/niku/blob/main/lib/widget/niku.dart#L1048
    
    niku-2.3.2/lib/widget/niku.dart:1048:25
    
    

    error log:

    
    ../../../../../../.pub-cache/hosted/pub.flutter-io.cn/niku-2.3.2/lib/widget/niku.dart:1048:25: Error: The argument type 'BorderRadiusGeometry?' can't be assigned to the parameter type 'BorderRadius?'.
     - 'BorderRadiusGeometry' is from 'package:flutter/src/painting/border_radius.dart' ('../../../../../../.fvm/versions/3.3.0/packages/flutter/lib/src/painting/border_radius.dart').
     - 'BorderRadius' is from 'package:flutter/src/painting/border_radius.dart' ('../../../../../../.fvm/versions/3.3.0/packages/flutter/lib/src/painting/border_radius.dart').
              borderRadius: radius,
                            ^
    
    Command PhaseScriptExecution failed with a nonzero exit code
    
    
    opened by hhstore 1
  • feat: 2.3 (Tempestissimo)

    feat: 2.3 (Tempestissimo)

    2.3 Tempestissimo

    I'm very proud to announce the new release of Niku. A lot of research and effort into this version.

    I'm excited to announce the stable release of Niku 2.3 named "Tempestissimo".

    Tempestissimo

    Named after Tempestissimo composed by t+pazolite, a hardcore gothic boss music featured in Arcaea alongside a new character, Tairitsu (Tempest).

    This version feature: Tempest Engine, a rewritten internal architecture entirely change.

    Tempest Engine

    Focused on performance improvement, reducing memory usage, and faster allocation time. Make possible by new features like, "Flatten Merge", and lazy execution.

    Flatten Merge

    Flatten Merge is a technique that allows duplicated properties to merge together, allocating only one widget on the duplicated stack.

    For example, Padding:

    n.Box()
      ..px = 16
      ..py = 8
      ..px = 4
    

    Normally, this would allocate 3 nested Padding widgets which is not good for both allocation time and memory usage.

    But with Tempest Engine, it now allocates only 1 Padding instead of 3.

    Lazy Execution

    Previously, Niku eagerly allocate widgets on mutable getter/setter, which isn't good practice for a reference style like the Stylesheet pattern.

    However, with the new architect, the property is now lazily constructed, which means the widget now only holds a "blueprint" for creating a widget instead of creating them instead before build.

    This reduced a lot of memory usage when used with the Stylesheet pattern and Psuedo const like ..deps and ..freezed. Allowing fine tuning performance even better.

    The allocation time of Tempest Engine is in fact, faster than native Flutter in terms of reference allocation.

    Quotes:

    The new Niku "Tempest" Engine outperforms native Flutter in terms of Widget initialization (creation), or near in the most case. The test was conducted by measuring the creation time of generating 1 million Text with a Container of manual 40 iterations.

    Average Result: Niku: 63.86ms Flutter: 68.83ms

    Mutable Child

    Tempest Engine also allows a child to be mutable.

    This is why the change of the Niku widget for allowing mutable child matter.

    Now it doesn’t have to store build stack anymore, because now Parent Proxy can ensure that the order of parent proxy will not block the child's property anymore.

    All it has to do is to separately allocate Parent and Child. When child property is set, it only affects the child the same as the Parent.

    Now when the build method is called, all it has to do is, assign Parent-Child to child builder.

    This eliminates the need for allocating the parent build stack., reducing the n amount of Parent widget allocation to only 1.

    Codebase Reduction

    With Tempest Engine writing for taking advantage of the new feature of Dart. Rewritten, making everything modular and reusable with abstract class and extension and advantage of Tempest Engine.

    Niku 2.3 is able to reduce an entire codebase reduction by 50%.

    This means that the shipped version of your app will be even lighter by the currently very lightweight library and even faster.

    Tempest Engine performance

    With a lot of new micro-optimization, taking advantage of the new Dart feature, Tempest Engine increases a lot of performance your Niku app.

    Notable improvements are:

    • Parent Proxy is faster by 50%.
    • Up to 40% better performance for Parent Builder without having to do anything.
    • 8.75x faster for Text reference initialization.

    Full Support for Parent Proxy

    Parent Proxy allows you to call parent property without using useParent, by accessing via n prefix. Available for every widget.

    Parent Proxy Example

    This helps developers to compose parent styling even easier on minimal change to parent property.

    Read more at Parent Styling

    Flutter 3 and Material 3 Support

    Niku 2.3 also adds support for Flutter 3 and supports MacOS on Apple Silicon.

    Niku running on Flutter 3 MacOS

    Not only partial supports but also taking advantage of the new property in Material 3 supports.

    For example:

    • New Typography in Material 3
    • New ripple effects, like .sparkle

    No matter what Material version you're using, Niku is able to fully support both versions.

    Extension Transformation

    Niku 2.3 add a new extension widget transformation.

    Notable usage is "Text".n, which transforms a String to Text as a shortcut.

    Reducing character to type in order to allocate widget. Text Transform example

    Extension Transformation also takes advantage of the Material Typography System. Allowing you to directly apply style from Material 3 Typography without the need of context thanks to Tempest Engine. Typography Transform

    Recap

    Phew, that's a lot to unpack.

    But to recap:

    • Featuring Tempest Engine, you will gain a free performance boost without having to do anything.
    • 50% library size reduction.
    • Flutter 3 supports, taking advantage of Material 3 and macOS.
    • Extension Transformation, reducing the need for widget allocation with a new shortcut.
    • And much more with notable change under the release note.

    Tempest Engine is briefly discussed here, but if you want to understand how the new Tempest Engine works, you can take a look into But how does Tempest Engine in Niku work?.

    So, that's pretty much all for this release, until the next time we meet again with a new exciting updates and features.

    Now for notable change for this version and migration guide:

    Breaking Change:

    • Rename the following property on Image:
      • circleProgress -> useCircleProgress
      • linearProgress -> useLinearProgress
    • Rename on to deps, and useGesture to on.
    • Add labelText as replacement of label which is now accept Widget
    • Move useTextStyle to useNikuTextStyle in NikuButton to add useTextStyle for NikuState
    • Remove useNiku, nikuConstraints, nikuPadding, nikuMargin from Niku and Parent Proxy.

    Feature:

    • Add material 3 shortcut.
    • sparkle on NikuButton as shortcut for ..splashFactory = InkSparkle.splashFactory
    • Add Material 3 Typography initialzation shortcut, and Text Factory
      • displayLarge
      • displayMedium
      • displaySmall
      • titleLarge
      • titleMedium
      • titleSmall
      • bodyLarge
      • bodyMedium
      • bodySmall
      • labelLarge
      • labelMedium
      • labelSmall
    • Internal architecture changed called Tempestissimo.
      • Significant performance improvement, parent builder rewrite
      • Parent Property builder now lazily executed
      • Flatten and parent property
    • Add ExplictParentBuilder to quickly handle single use of parent builder
    • New hook: useShadow
    • Add new property, borderRadius, shadow, highlightColor, focusColor, hoverColor

    Change:

    • Add .offstage, .show shortcut
    • Update .useScrollbar to Flutter 3
    • .hidden now based on Offset
    • Initial work with Flutter 3 and Material3.
    • useThemeSelector now can accept nullable value
    • Refactored Proxy, now has 50% less code and much cleaner
    • Parent Builder architecture rewrite, name Tempestissimo.
    • rounded now use NikuRounded under the hood to auto inherit borderRadius for the next builder, eg. shadows, and border.
    • Deprecate UseQueryMacro<T>, merged into NikuBuildMacro<T>

    Bug fix:

    • Text Theme doesn't update on Brightness change
    • _applyConstraints, _applyPadding, _applyPositions cause Stackoverflow
    • Gap now doesn't use square ratio, the content cross-dimension is now preserved.
    opened by SaltyAom 1
  • Break on Flutter 3

    Break on Flutter 3

    Problem

    Can't use Niku with the new Flutter 3.

    Solution

    Update to 2.3.0-experimental.2

    Here's a screenshot of Niku with Flutter 3 running on Apple Silicon MacOS. Screen Shot 2565-05-12 at 21 58 59

    Detail:

    I have no idea how or why Niku breaks on Flutter 3. However, Niku 2.3 implemented an internal architecture rewrite known as Tempest Engine which for some reason doesn't break all the thing.

    As it's a confirmed candidate for the next version of Niku and I have tested it a lot before publishing it as experimental, you should be able to use it without much breaking change (only 2 breaking changes which shouldn't affect a lot of people).

    Also, I'll leave this issue open until the stable release of Niku 2.3. So, yeah, if you encounter the problem and found a bug, feel free to report it by filing a new issue.

    good first issue 
    opened by SaltyAom 1
  • feat(angleseeker): SliverToBox, and form key (2.2.4)

    feat(angleseeker): SliverToBox, and form key (2.2.4)

    [2.2.4] - 2022/03/23

    Feature:

    • Add sliverToBox, useForm, and formKey to Parent Proxy

    [2.2.3] - 2022/03/23

    Feature:

    • Add useTitle, useContent to NikuAlert
    • Add sliverToBox, useForm, and formKey to Niku

    Bugs fix:

    • Set borderColor to transparent on calling noUnderline on TextFormField
    • .gap not working with Row
    opened by SaltyAom 1
  • feat(angleseeker): Minor bug fixes

    feat(angleseeker): Minor bug fixes

    Port 2.2.1, and 2.2.2 to main

    [2.2.2] - 2022/03/21

    Bugs fix:

    • NikuListTile.apply not applying parent property

    [2.2.1] - 2022/03/21

    Feature:

    • Add .rounded to NikuImage
    • Add FocusNodeMacro, adding useFocusNode, useFocus
    • Add useTitle, useSubtitle, useLeading, useTrailing
    opened by SaltyAom 1
  • feat: 2.1 (Ga1ahad)

    feat: 2.1 (Ga1ahad)

    It's been a wild ride of Niku with you all.

    Since Niku 2.0 has been released, Niku has been getting a lot of attention lately, and we really want to say thank you to all for joining us on how we could reimagine composing UI in the Flutter together.

    For this release, 2.1 or ga1ahad have been working on for quite some time, drafted even before the release of 2.0 rc. The name "Ga1ahad" comes from Ga1ahad and Scientific Witchery.

    Ga1ahad and Scientific Witchery

    Without further ado, let's see what's new in Niku 2.1~ Fubuki Scream

    Proxy

    Previously, with Niku, composing nested objects would required you an additional, for example composing n.Button.

    n.Button(Text("Delete"))
      ..onPressed = log
      ..useTextStyle((v) => v..color = Colors.red)
      ..useButtonStyle((v) => v..splash = Colors.red.withOpacity(.15));
    

    This is good for grouping the styling, easily indicating which style is for which part, but to be honest, it's slow and annoying to write.

    That's why Proxy is created to fix this problem.

    Proxy is an abstract class for mapping your setter and shortcut to a nested object property without using a hook. It handles creating object if doesn't exist and just write the property, that's it, no magic or expensive calculation.

    This allows you to write the direct setter without having useTextStyle or useButtonStyle hook.

    n.Button(Text("Delete"))
      ..onPressed = log
      ..color = Colors.red
      ..splash = Colors.red.withOpacity(.15);
    

    Not only that you can use Proxy to handle the style of nested objects, but you can also handle the parent property builder as well.

    Proxy support Button and TextFormField with all properties, and shortcuts.

    Parent Proxy

    Same as Proxy but for parents.

    Parent Proxy allows you to compose your parent with access to parent property without having to create useParent.

    For the layout widget like Column and Row which usually required explicit set of width or other property like w100, bg, scrollable, rounded, border and etc.

    Providing a shortcut proxy would be really convenient, so the parent proxy is here for the job.

    With parent proxy, you can now compose some parent shortcut for some specific widget starting with Column and Row.

    n.Row([])
      ..center
      ..wFull
      ..bg = Colors.red
      ..rounded = 8
    

    Because some widgets might have conflict names with parent property and shortcuts like padding, only a specific selection of widgets are get to have Parent Proxy.

    But every parent has limited access to some convenient Parent Proxy, starting with margin and m.

    useThemeSelector

    Dark theme has become an essential part of app development, with Niku you can use useDarkMode to handle the case. But the handler is quite, imperative to say the least.

    n.Box()
      ..useDarkMode((v, isDark) => v
        ..bg = isDark ? Colors.grey.shade800 : Colors.white);
    

    You are provided with child and isDark as an indicator for dark mode but you still have to handle the logic yourself. For a single property, it's quite simple but when there's more property it gets annoying. Besides what about some property you might want to have in specific mode only? You have to handle the case yourself.

    This is why useThemeSelector is introduced. Basically, it provide you the same syntax as useScreen but for dark mode and handle the rest of for diffing and applyment for you.

    n.Box()
      ..useThemeSelector(
        light: (v) => v..bg = Colors.white,
        dark: (v) => v..bg = Colors.grey.shade800,
      );
    

    GridView and ListView

    Gridview and ListView are now supported as Niku widgets, with all the factory property and utilities you can use.

    It's recommended to use GridView and ListView for Style Sheet Pattern because of the redundant syntax provided.

    Breaking Change

    • flexible is now flex on Niku
    • Deprecated required value of TextFormField in favor of hint.
      • To migrate, please add factory .hint or add it as named parameter

    Minor Feature

    • Add ConstraintsMacro to NikuInputDecoration
    • Add useTextStyle to DropdownButton
    • Add State Utility Hooks to NikuButton
    • Add color setter to NikuButtonStyle
    • Add of alias for apply

    Change

    • border is now baseBorder, and allBorder is now border
    • margin property now uses Padding instead of Container because that's how native Flutter doing it. Yes, margin is actually padding in Flutter.
      • Remove function allocation from _init of MapTextStyleMacro
    • Add center to NikuColumn, and NikuRow
    • Replace childrenWithGap with $internalComposeGap in GapMacro
    • Add gap property to AxisLayout
    • gap can now be applied
    • childrenWithGap now only composed on build
    • borderWidth is now baseBorderWidth to follow the same convention with border, borderColor, and borderStyle on proxy
    • AxisLayoutMacro is now AxisLayoutProxy

    Fix

    Bug fix:

    • Remove print from PaddingMacro
    • Fix 'owner!._debugCurrentBuildTarget == this': is not true. when using useDarkMode
    • useDarkMode and useThemeSelector not switching context between
    opened by SaltyAom 1
  • add MainAxisSize argument option in NikuColumn and NikuRow

    add MainAxisSize argument option in NikuColumn and NikuRow

    MainAxisSize is a crucial property of Column and Row in rendering and layout building. so NikuColumn and NikuRow should have such property available too.

    opened by y-pakorn 1
  • Add SelectableText to be niku-able.

    Add SelectableText to be niku-able.

    Add SelectableText to be niku-able. The NikuSelectableText widget is based on NikuText, all descriptions stay the same except for the one that explicitly said about Text widget was changed to SelectableText.

    opened by y-pakorn 1
  • feat: 2.2 (Aegleseeker)

    feat: 2.2 (Aegleseeker)

    Improvement:

    • Reduce Time Complexity of hooks from UseQueryMacro from O(n(2i + p)) to O(n) where n is property, p is parent total callstack, and i is total invocation. By passing widget self as reference instead of immutable copied then diffing, and apply The following hooks benefits in performance improvement:
      • useQuery
      • useSize
      • useDarkMode
      • useThemeSelector
      • useScreen

    Feature:

    • New parent proxy available for all widget:
      • expanded
      • flex
      • fullSize
      • fullWidth, wFull, w100
      • fullHeight, hFull, h100
      • fractionSize, sizePercent
      • fractionWidth, fractionW, fw, wFactor, widthPercent, wPercent
      • fractionHeight, fractionH, hw, hFactor, heightPercent, hPercent
      • boxConstraints
      • nikuConstraints
      • maxSize
      • minSize
      • maxWidth, maxW, wMax
      • minWidth, minW, wMin
      • maxHeight, maxH, hMax
      • minHeight, minH, hMin
      • width, w
      • height, h
      • useGesture
    • New parent proxy available for AxisLayourProxy
      • alignTopLeft
      • alignTopCenter
      • alignTopRight
      • alignCenterLeft
      • alignCenter
      • alignCenterRight
      • alignBottomLeft
      • alignBottomCenter
      • alignBottomRight
      • New widget: NikuRadio, NikuRadioListTile, NikuDismissible
    • New hook: useTransition, useTransitions
    • Add property: splash, wFactor, hFactor to Niku
    • New utility widget NikuAnimated, NikuAnimateds
    • New proxy: ListTile with dismiss for NikuDismissible

    Change:

    • Move part of AxisProxy to NikuBuildMacro
    • Refactor, and organize examples

    Bug fixes:

    • obscureCharacter not working in NikuTextFormField
    opened by SaltyAom 0
  • Unable to use expands method on NikuTextField

    Unable to use expands method on NikuTextField

    expands method on nikuTextField will throw assertion error when ran because maxLines and minLines property can't be set to null.

    When build this

    NikuTextField("yoyo")
        .expands()
        .niku()
        .height(200)
        .width(200),
    

    will throws

    The following assertion was thrown building Builder(dirty): 
    Assertion failed:
    !expands || (maxLines == null && minLines == null)
    "minLines and maxLines must be null when expands is true."
    ...
    

    So, The expected property would be,

    NikuTextField("yoyo")
        .maxLines(null) // currently not nullable
        .minLines(null) // currently not nullable
        .expands()
        .niku()
        .height(200)
        .width(200),
    
    opened by y-pakorn 0
Releases(2.3)
  • 2.3(Jun 11, 2022)

    I'm very proud to announce the new release of Niku. A lot of research and effort into this version.

    I'm excited to announce the stable release of Niku 2.3 named "Tempestissimo".

    Tempest Tairitsu

    Named after Tempestissimo composed by t+pazolite, hardcore gothic boss music featured in Arcaea alongside a new character, Tairitsu (Tempest).

    This version feature: Tempest Engine, a rewritten internal architecture entirely change.

    Tempest Engine

    Focused on performance improvement, reducing memory usage, and faster allocation time. Make possible by new features like, "Flatten Merge", and lazy execution.

    Flatten Merge

    Flatten Merge is a technique that allows duplicated properties to merge together, allocating only one widget on the duplicated stack.

    For example, Padding:

    n.Box()
      ..px = 16
      ..py = 8
      ..px = 4
    

    Normally, this would allocate 3 nested Padding widgets which is not good for both allocation time and memory usage.

    But with Tempest Engine, it now allocates only 1 Padding instead of 3.

    Lazy Execution

    Previously, Niku eagerly allocate widgets on mutable getter/setter, which isn't good practice for a reference style like the Stylesheet pattern.

    However, with the new architect, the property is now lazily constructed, which means the widget now only holds a "blueprint" for creating a widget instead of creating them instead before build.

    This reduced a lot of memory usage when used with the Stylesheet pattern and Psuedo const like ..deps and ..freezed. Allowing fine tuning performance even better.

    The allocation time of Tempest Engine is in fact, faster than native Flutter in terms of reference allocation.

    Quotes:

    The new Niku "Tempest" Engine outperforms native Flutter in terms of Widget initialization (creation), or near in the most case. The test was conducted by measuring the creation time of generating 1 million Text with a Container of manual 40 iterations.

    Average Result: Niku: 63.86ms Flutter: 68.83ms

    Mutable Child

    Tempest Engine also allows a child to be mutable.

    This is why the change of the Niku widget for allowing mutable child matter.

    Now it doesn’t have to store build stack anymore, because now Parent Proxy can ensure that the order of parent proxy will not block the child's property anymore.

    All it has to do is to separately allocate Parent and Child. When child property is set, it only affects the child the same as the Parent.

    Now when the build method is called, all it has to do is, assign Parent-Child to child builder.

    This eliminates the need for allocating the parent build stack., reducing the n amount of Parent widget allocation to only 1.

    Codebase Reduction

    With Tempest Engine writing for taking advantage of the new feature of Dart. Rewritten, making everything modular and reusable with abstract class and extension and advantage of Tempest Engine.

    Niku 2.3 is able to reduce an entire codebase reduction by 50%.

    This means that the shipped version of your app will be even lighter by the currently very lightweight library and even faster.

    Tempest Engine performance

    With a lot of new micro-optimization, taking advantage of the new Dart feature, Tempest Engine increases a lot of performance your Niku app.

    Notable improvements are:

    • Parent Proxy is faster by 50%.
    • Up to 40% better performance for Parent Builder without having to do anything.
    • 8.75x faster for Text reference initialization.

    Full Support for Parent Proxy

    Parent Proxy allows you to call parent property without using useParent, by accessing via n prefix. Available for every widget.

    Parent Proxy Example

    This helps developers to compose parent styling even easier on minimal change to parent property.

    Read more at Parent Styling

    Flutter 3 and Material 3 Support

    Niku 2.3 also adds support for Flutter 3 and supports MacOS on Apple Silicon.

    Niku running on Flutter 3 MacOS

    Not only partial supports but also taking advantage of the new property in Material 3 supports.

    For example:

    • New Typography in Material 3
    • New ripple effects, like .sparkle

    No matter what Material version you're using, Niku is able to fully support both versions.

    Extension Transformation

    Niku 2.3 add a new extension widget transformation.

    Notable usage is "Text".n, which transforms a String to Text as a shortcut.

    Reducing character to type in order to allocate widget. Text Transform example

    Extension Transformation also takes advantage of the Material Typography System. Allowing you to directly apply style from Material 3 Typography without the need of context thanks to Tempest Engine. Typography Transform

    Recap

    Phew, that's a lot to unpack.

    But to recap:

    • Featuring Tempest Engine, you will gain a free performance boost without having to do anything.
    • 50% library size reduction.
    • Flutter 3 supports, taking advantage of Material 3 and macOS.
    • Extension Transformation, reducing the need for widget allocation with a new shortcut.
    • And much more with notable change under the release note.

    Tempest Engine is briefly discussed here, but if you want to understand how the new Tempest Engine works, you can take a look into But how does Tempest Engine in Niku work?.

    So, that's pretty much all for this release, until the next time we meet again with a new exciting updates and features.

    Now for notable change for this version and migration guide:

    Breaking Change:

    • Rename the following property on Image:
      • circleProgress -> useCircleProgress
      • linearProgress -> useLinearProgress
    • Rename on to deps, and useGesture to on.
    • Add labelText as replacement of label which is now accept Widget
    • Move useTextStyle to useNikuTextStyle in NikuButton to add useTextStyle for NikuState
    • Remove useNiku, nikuConstraints, nikuPadding, nikuMargin from Niku and Parent Proxy.

    Feature:

    • Add material 3 shortcut.
    • sparkle on NikuButton as shortcut for ..splashFactory = InkSparkle.splashFactory
    • Add Material 3 Typography initialzation shortcut, and Text Factory
      • displayLarge
      • displayMedium
      • displaySmall
      • titleLarge
      • titleMedium
      • titleSmall
      • bodyLarge
      • bodyMedium
      • bodySmall
      • labelLarge
      • labelMedium
      • labelSmall
    • Internal architecture changed called Tempestissimo.
      • Significant performance improvement, parent builder rewrite
      • Parent Property builder now lazily executed
      • Flatten and parent property
    • Add ExplictParentBuilder to quickly handle single use of parent builder
    • New hook: useShadow
    • Add new property, borderRadius, shadow, highlightColor, focusColor, hoverColor

    Change:

    • Add .offstage, .show shortcut
    • Update .useScrollbar to Flutter 3
    • .hidden now based on Offset
    • Initial work with Flutter 3 and Material3.
    • useThemeSelector now can accept nullable value
    • Refactored Proxy, now has 50% less code and much cleaner
    • Parent Builder architecture rewrite, name Tempestissimo.
    • rounded now use NikuRounded under the hood to auto inherit borderRadius for the next builder, eg. shadows, and border.
    • Deprecate UseQueryMacro<T>, merged into NikuBuildMacro<T>

    Bug fix:

    • Text Theme doesn't update on Brightness change
    • _applyConstraints, _applyPadding, _applyPositions cause Stackoverflow
    • Gap now doesn't use square ratio, the content cross-dimension is now preserved.
    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Mar 18, 2022)

    It's only been just 2 weeks since the latest release of 2.1. Today, we're expanding the horizon of Niku across the board again with Niku 2.2

    This time, the name "Aegleseeker" is from the name of music composed by "Silentroom" vs "Frums", which featured in Rhythm game called Arcaea.

    Aegleseeker

    This version features more of a parent proxy.

    Extended Parent Proxy

    Quote from 2.1 (Ga1ahad)

    Parent Proxy allows you to compose your parent with access to parent property without having to create useParent.
    

    Previously, only Column and Row got extended parent proxy which normal Niku widget only got margin for parent proxy.

    We investigated that Flutter developers commonly want more than just margin, but the more common proxy like width, height is also important, so we port all of the sizing shortcuts to every Niku widget.

    We also add more proxy to AxisLayoutProxy, which add more common pattern like parent alignment.

    Take a look at below figure, notice that there's no useParent because it's now handled by common property builder provided by extended parent proxy. image

    Introducing useTransition

    Ever want to animate property from one to another without hassle? Then you might want to use useTransition!

    With use transition, Niku auto animate property you provided from previous to new without you manually creating AnimationController or StatefulWidget, it can be used directly in StatelessWidget like any other property builder.

    To see how clean the useTransition can provide at the figure below. Without useTransition: Without useTransition

    With useTransition and Niku: With useTransition

    Improvement of UseQueryMacro

    Reduce Time Complexity of hooks from UseQueryMacro from O(n(2i + p)) to O(n) where n is property, p is parent total call stack, and i is a total invocation.

    Bypassing widget self as reference instead of immutable copied then diffing, and apply

    The following hooks benefits in performance improvement: - useQuery - useSize - useDarkMode - useThemeSelector - useScreen

    Feature:

    • New parent proxy available for all widget:
      • expanded
      • flex
      • fullSize
      • fullWidth, wFull, w100
      • fullHeight, hFull, h100
      • fractionSize, sizePercent
      • fractionWidth, fractionW, fw, wFactor, widthPercent, wPercent
      • fractionHeight, fractionH, hw, hFactor, heightPercent, hPercent
      • boxConstraints
      • nikuConstraints
      • maxSize
      • minSize
      • maxWidth, maxW, wMax
      • minWidth, minW, wMin
      • maxHeight, maxH, hMax
      • minHeight, minH, hMin
      • width, w
      • height, h
      • useGesture
    • New parent proxy available for AxisLayourProxy
      • alignTopLeft
      • alignTopCenter
      • alignTopRight
      • alignCenterLeft
      • alignCenter
      • alignCenterRight
      • alignBottomLeft
      • alignBottomCenter
      • alignBottomRight
      • New widget: NikuRadio, NikuRadioListTile, NikuDismissible
    • New hook: useTransition, useTransitions
    • Add property: splash, wFactor, hFactor to Niku
    • New utility widget NikuAnimated, NikuAnimateds
    • New proxy: ListTile with dismiss for NikuDismissible

    Change:

    • Move part of AxisProxy to NikuBuildMacro
    • Refactor, and organize examples

    Bug fixes:

    • obscureCharacter not working in NikuTextFormField
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Mar 2, 2022)

    It's been a wild ride of Niku with you all.

    Since Niku 2.0 has been released, Niku has been getting a lot of attention lately, and we really want to say thank you to all for joining us on how we could reimagine composing UI in the Flutter together.

    For this release, 2.1 or ga1ahad have been working on for quite some time, drafted even before the release of 2.0 rc. The name "Ga1ahad" comes from Ga1ahad and Scientific Witchery.

    Ga1ahad and Scientific Witchery

    Without further ado, let's see what's new in Niku 2.1~ Fubuki Scream

    Proxy

    Previously, with Niku, composing nested objects would required you an additional, for example composing n.Button.

    n.Button(Text("Delete"))
      ..onPressed = log
      ..useTextStyle((v) => v..color = Colors.red)
      ..useButtonStyle((v) => v..splash = Colors.red.withOpacity(.15));
    

    This is good for grouping the styling, easily indicating which style is for which part, but to be honest, it's slow and annoying to write.

    That's why Proxy is created to fix this problem.

    Proxy is an abstract class for mapping your setter and shortcut to a nested object property without using a hook. It handles creating object if doesn't exist and just write the property, that's it, no magic or expensive calculation.

    This allows you to write the direct setter without having useTextStyle or useButtonStyle hook.

    n.Button(Text("Delete"))
      ..onPressed = log
      ..color = Colors.red
      ..splash = Colors.red.withOpacity(.15);
    

    Not only that you can use Proxy to handle the style of nested objects, but you can also handle the parent property builder as well.

    Proxy support Button and TextFormField with all properties, and shortcuts.

    Parent Proxy

    Same as Proxy but for parents.

    Parent Proxy allows you to compose your parent with access to parent property without having to create useParent.

    For the layout widget like Column and Row which usually required explicit set of width or other property like w100, bg, scrollable, rounded, border and etc.

    Providing a shortcut proxy would be really convenient, so the parent proxy is here for the job.

    With parent proxy, you can now compose some parent shortcut for some specific widget starting with Column and Row.

    n.Row([])
      ..center
      ..wFull
      ..bg = Colors.red
      ..rounded = 8
    

    Because some widgets might have conflict names with parent property and shortcuts like padding, only a specific selection of widgets are get to have Parent Proxy.

    But every parent has limited access to some convenient Parent Proxy, starting with margin and m.

    useThemeSelector

    Dark theme has become an essential part of app development, with Niku you can use useDarkMode to handle the case. But the handler is quite, imperative to say the least.

    n.Box()
      ..useDarkMode((v, isDark) => v
        ..bg = isDark ? Colors.grey.shade800 : Colors.white);
    

    You are provided with child and isDark as an indicator for dark mode but you still have to handle the logic yourself. For a single property, it's quite simple but when there's more property it gets annoying. Besides what about some property you might want to have in specific mode only? You have to handle the case yourself.

    This is why useThemeSelector is introduced. Basically, it provide you the same syntax as useScreen but for dark mode and handle the rest of for diffing and applyment for you.

    n.Box()
      ..useThemeSelector(
        light: (v) => v..bg = Colors.white,
        dark: (v) => v..bg = Colors.grey.shade800,
      );
    

    GridView and ListView

    Gridview and ListView are now supported as Niku widgets, with all the factory property and utilities you can use.

    It's recommended to use GridView and ListView for Style Sheet Pattern because of the redundant syntax provided.

    Breaking Change

    • flexible is now flex on Niku
    • Deprecated required value of TextFormField in favor of hint.
      • To migrate, please add factory .hint or add it as named parameter

    Minor Feature

    • Add ConstraintsMacro to NikuInputDecoration
    • Add useTextStyle to DropdownButton
    • Add State Utility Hooks to NikuButton
    • Add color setter to NikuButtonStyle
    • Add of alias for apply

    Change

    • border is now baseBorder, and allBorder is now border
    • margin property now uses Padding instead of Container because that's how native Flutter doing it. Yes, margin is actually padding in Flutter.
      • Remove function allocation from _init of MapTextStyleMacro
    • Add center to NikuColumn, and NikuRow
    • Replace childrenWithGap with $internalComposeGap in GapMacro
    • Add gap property to AxisLayout
    • gap can now be applied
    • childrenWithGap now only composed on build
    • borderWidth is now baseBorderWidth to follow the same convention with border, borderColor, and borderStyle on proxy
    • AxisLayoutMacro is now AxisLayoutProxy

    Fix

    Bug fix:

    • Remove print from PaddingMacro
    • Fix 'owner!._debugCurrentBuildTarget == this': is not true. when using useDarkMode
    • useDarkMode and useThemeSelector not switching context between
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Feb 21, 2022)

    This day marks a milestone of a brighter new future in Flutter app development. The release of Niku codename Heaven and Earth or Niku 2.

    After months of research and experiment, we finally settle down with the answer, and we think you going to love it.

    Niku 2

    TLDR; an entire rewrite, read more at Introducing Niku 2

    shirakami-fubuki-virtual-youtuber

    Below is the Change Log from the previous 2.0 beta

    [2.0.0-compat.0] - 2022/02/21

    Base on 2.0.0-rc.8

    A compatibility version for working with both v1 and v2 for gradually migrating from v1.

    To gradually migrate from v1, simply replace all:

    // From
    import 'package:niku/niku.dart';
    // into
    import 'package:niku/v1/niku.dart';
    

    You can easily use IDE like VS Code to find and replace all package:niku/ with package:niku/v1/ then it should work just fine, gradually migrate from v1.

    [2.0.0-rc.8] - 2022/02/20

    Bux Fix:

    • Add copied to NikuImage, NikuSlider, NikuRangeSlider.
    • Apply parent builder to copied method

    [2.0.0-rc.7] - 2022/02/20

    Feature:

    • New use on NikuWidget to apply multiple styles at once
    • Add useBorder, useRoundedBorder
    • Add apply to NikuIcon
    • Add WidthHeightMacro

    Change:

    • Add Full Macro conventions
    • Use Parent Builder stack instead of direct setter to support apply parent styling

    Bux Fix:

    • Fix wrong spelling of actionPb
    • Use Full Macro on Alert
    • n.showDialog now accepts any widget

    [2.0.0-rc.6] - 2022/02/19

    Change:

    • showNikuDialog now accepts any widget

    [2.0.0-rc.5] - 2022/02/17

    Bug Fix:

    • Add default .rounded to NikuButton
    • Fix gap inserted to last children
    • Fix Column with gap required at least 1 children

    [2.0.0-rc.4] - 2022/02/14

    Breaking Change:

    • Remove NikuImage.file factory to support web platform.

    [2.0.0-rc.3] - 2022/02/14

    Breaking Change:

    • Remove cached network image due to not supporting all platform yet.

    [2.0.0-rc.2] - 2022/02/13

    Feature:

    • Add .quarterTurns, bgBlur, clipRect, clipOval to Niku

    Change:

    • Remove default styling from NikuText to match default Flutter Text, eg. TextBasis.

    Bug fixes:

    • AxisMacro not assigning wrong field name

    [2.0.0-rc.1] - 2022/02/13

    Breaking Change:

    • Migrate .useScreen to useSize
    • Migrate .useQuery to .useScreen
    • Migrate .useEvents to useGesture
    • Remove TransformSelectableText

    Feature:

    • Add .useQuery to handle MediaQueryData
    • Add useBorder, useNikuBorder, useBorderColor, useBorderWidth hook
    • Add .useDarkMode to handle element styling on Dark Theme
    • Add n.Image.cache to use CacheNetworkImage

    Bug fixes:

    • Correct focusedErrorBorder setter name

    [2.0.0-experimental.4] - 2022/01/31

    Breaking Change:

    • Remove asNiku on Widget (still working for object)
    • Migrate .useOn to useEvents

    Feature:

    • Add .focusColor, .splashColor, highlightColor, hoverColor to NikuCheckboxListTile
    • Add .adaptive to NikuAlert
    • Add .adaptive to Switch
    • Add .adaptive to NikuTextFormField
    • Add NikuShowDialog to handle adaptive dialog
    • New NikuQuery widget

    Bug fixes:

    • .on property in Niku doesn't passing dependencies to concilation process

    [2.0.0-experimental.3] - 2022/01/29

    Feature:

    Bug fixes:

    • .on property in Niku doesn't passing dependencies to concilation process

    [2.0.0-experimental.2] - 2022/01/25

    Feature:

    • Game Changing, NikuOn, .on and .freezed property, read more about it here
    • NikuDropdownButton widget for DropdownButton

    Bug fixes:

    • Change from Nullish cascade equality to nullish check to override useStyle's style

    Breaking Change:

    • Migrate .useStyle to .useTextStyle() on NikuText.
    • Migrate .useStyle to .useButtonStyle() on NikuButton.
    • Change .useStyle to .useButtonStyle() on NikuButton.
    • Migrate .useBuilder, useParent to useChild on Niku.
    • Migrate from .value to .widget on every Niku component.
    • Migrate from style to textStyle on every Niku component.

    [2.0.0-experimental.1] - 2021/12/16

    • Namespace
    • Selectable Text

    [2.0.0-experimental.0] - 2021/12/16

    Heaven and Earth, batch 1. @see #17

    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Jul 11, 2021)

    First of all, big thanks to @y-pakorn for this release! He contributes to Niku for a several PR now, in fact, this entire release is happened because of his contribution which solved bug caused by my clumsiness, tee hee~

    @y-pakorn's contributions: #3 #4 #5 #6.

    Feature:

    Bug fixes:

    • Fixes .fullWidth() which cause full height.
    • Makes error text optional on NikuTextField.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Apr 24, 2021)

  • 1.0.0.alpha-3(Mar 31, 2021)

    Add Niku DOGcumentation and release change log so far. Dog

    [1.0.0-alpha.3] - 2021/3/31

    Feature:

    • Add cursor to IconButton.
    • Add the following property to IconButton:
      • size,
      • minSize, minimumSize
      • maxSize, maximumSize
      • minWidth, minimumWidth
      • minHeight, minimumHeight
      • maxWidth, maximumWidth
      • maxHeight, maximumHeight
    • Boolean method on NikuTextField now has default value of true.

    Breaking Change:

    • Rename border to b and setBorder to border.
    • Change obscureTextFormField to obscureText on NikuTextField.
    • Add asPassword on NikuTextField.
    • Remove disabledSmartDashes and disabledSmartQuotes.
    • enableSmartQuotes and enableSmartDashes now accept option boolean default as true.
    • Change from inputDecorationEnable to enableInputDecoration.
    • Change from ...textFormField to ...text in NikuTextField.

    Bug fix:

    • Fix Visual Density in NikuButton.
    • Setting multiple border variant not working

    [1.0.0-alpha.2] - 2021/3/28

    Breaking Change:

    • Swap arguments of animated

    Change:

    • Remove Nested instance from base property
    • Add default value of true to absortPointer and ignorePointer

    [1.0.0-alpha.1] - 2021/3/25

    Bug Fix:

    • add Key

    [1.0.0-alpha.0] - 2021/3/24

    Feature:

    • Remove .build() and .style()
    • Niku Internal is now mutating property instead of stacking
    • Add .asNiku on component instead of using Niku Component
    • Match NikuButton to idiomatic Dart
    • Add TextStyle to TextButton
    • Every Niku Component now support margin property

    Breaking Change:

    • Every Niku Component now extend NikuCore which extends StatelessWidget
    • Variant method NikuButton is removed
      • .icon to NikuButton.icon
      • .text to NikuButton.text
      • .elevated to NikuButton.elevated
      • .elevatedIcon to NikuButton.elevatedIcon
      • .outlined to NikuButton.outlined
      • .outlinedIcon to NikuButton.outlinedIcon

    Change:

    • Remove usage of this. except for constructor
    • Every margin property is moved to NikuCore
    • Build is now using internalBuild
    • Remove container if margin is not presented

    Bug fix:

    • Foreground on text change background instead
    • Fix margin not mistakenly setting on padding instead
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-alpha.4(Apr 1, 2021)

    Add initial support for NikuWrap, extension for Wrap.

    Korone

    [1.0.0-alpha.4] - 2021/4/1

    Feature:

    • Add NikuWrap
    • Add form to NikuBase.
    • Add focusedError to TextField border input.

    Bug fix:

    • apply using unexpected share property.
    • apply on NikuTextField without AlignVertical cause build to failed.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-aplha.0(Mar 26, 2021)

    No more build

    Niku 1.0.0 introduced breaking change. To remove build() method! Please remove your build method.

    Tea

    [1.0.0-alpha.0] - 2021/3/24

    Feature:

    • Remove .build() and .style()
    • Niku Internal is now mutating property instead of stacking
    • Add .asNiku on component instead of using Niku Component
    • Match NikuButton to idiomatic Dart
    • Add TextStyle to TextButton
    • Every Niku Component now support margin property

    Breaking Change:

    • Every Niku Component now extend NikuCore which extends StatelessWidget
    • Variant method NikuButton is removed
      • .icon to NikuButton.icon
      • .text to NikuButton.text
      • .elevated to NikuButton.elevated
      • .elevatedIcon to NikuButton.elevatedIcon
      • .outlined to NikuButton.outlined
      • .outlinedIcon to NikuButton.outlinedIcon

    Change:

    • Remove usage of this. except for constructor
    • Every margin property is moved to NikuCore
    • Build is now using internalBuild
    • Remove container if margin is not presented

    Bug fix:

    • Foreground on text change background instead
    • Fix margin not mistakenly setting on padding instead
    Source code(tar.gz)
    Source code(zip)
  • 0.5.5(Mar 15, 2021)

    The release is attempt to conclude version 0.5 of Niku. FBK

    This introduce the initial support for motion and animation also optimization. Instead of using Container for styling, Niku now prefer ColoredBox, DecoratedBox and SizedBox where suitable. This help optimizing the whole build process by using the smaller subset of Widget instead of full-blown like Container.

    [0.5.5] - 2021/3/15

    Feature:

    • Add animatedBuilder, animated for AnimationBuilder
    • Add animatedContainer for AnimatedContainer
    • Add semantics for Semantics

    Changed:

    • Move use of Container to DecoratedBox
      • The property which affected this changed including:
        • boxDecoration
        • border
        • shadows
    • Move use of Container to SizedBox
      • The property which affected this changed including:
        • fullSize
        • fullWidth
        • fullHeight

    [0.5.4] - 2021/3/11

    Bug fixes:

    • Wrong size on widthPercent, heightPercent and sizePercent
    • Unable to use NikuRow without specifying crossAxisAlignment
    • Add optional onTap to .inkwell

    [0.5.3] - 2021/3/11

    Bug fixes:

    • Wrong size on widthPercent, heightPercent and sizePercent

    [0.5.2] - 2021/3/11

    Feature:

    • Add builder on Niku for composing custom widget.
    • Add widthPercent, heightPercent and sizePercent

    Changed:

    • bg and backgroundColor of Niku are now using ColoredBox instead of Container
    • Niku now don't required any constructor Widget

    [0.5.1] - 2021/3/7

    Bug fixes:

    • Fix apply overriding written value
    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Mar 6, 2021)

    "For the future" FBK Dancing

    As Flutter 1.22 introduced new Material Button TextButton, ElevatedButton and OutlinedButton to replace FlatButton, RaisedButton and OutlineButton in order, Flutter team note that old API might be deprecated some time in the future and might be fully removed very soon. The deprecation is started now at Flutter 2.

    To fully transition to Flutter 2, Niku also introduced new NikuButton, a single simple widget to compose all button. This version is aimed for fully transition to Flutter 2 by removing old, deprecated API and replace with new one.

    NikuButton is simple, you defined which style you want and build it as button you preferred.

    Let's built TextButton

    NikuButton(Text("Flat Button"))
      .bg(Colors.blue)
      .px(40)
      .py(20)
      .rounded(8)
      .my(8)
      .build() // Built as TextButton
    
    NikuButton(Text("Flat Button"))
      .bg(Colors.blue)
      .px(40)
      .py(20)
      .rounded(8)
      .my(8)
      .elevated() // Built as ElevatedButton
    

    As you guessed, the default build is TextButton.

    Buildable button including:

    • TextButton
    • TextButton.icon
    • Elevated
    • Elevated.icon
    • OutlinedButton
    • OutlinedButton.icon

    We glad you interested in Niku! See you some time soon~

    Breaking Change

    • Deprecated:
      • FlatButton
      • RaisedButton
      • ElevatedButton
    • Move button.dart to oldButton.dart
    • Move NikuButton to button.dart
    • Importing package:niku/niku.dart won't import oldButton.dart
    • Only support Flutter 2.0.0 or newer

    Feature:

    • Add NikuButton for new building new universal Button including
      • TextButton
      • TextButton.icon
      • ElevatedButton
      • ElevatedButton.icon
      • OutlinedButton
      • OutlinedButton.icon

    Documentation

    • Add code highlight to widget example usage
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Mar 4, 2021)

    Migrate to Null Safety of Flutter 2 FBK

    Feature:

    • Add support for Sound Null Safety of Flutter 2

    Refactor:

    • Constructor to use this as parameter
    • Remove overflow from stack as it's deprecated

    Documentation:

    • Fix Null Coalesce
    • Fix borderColor, borderStyle from crashing on outlineButton
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Feb 22, 2021)

    Now you can use Niku everywhere! Introducting extension

    FBK

    Extension

    Modifying or extending Widget property. Which mean anything that is Widget got extend. Now we can extend widget with .niku() property!

    Read more at Available Extension

    Feature:

    • Add support for:
    • Add more property to Base Widget
      • Backdrop filter
      • Positioned
      • singleChildScrollView / scrollable
      • flexible / flex
    • Add group import
    • Add extension Widget
      • Add .niku() extension for widget

    Documentation:

    • Add property documentation
    • Correcting wrong spelling

    Bug fixes:

    • Fixes border not rendering children
    • Mark children constructor in Row as required
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Feb 21, 2021)

    [0.2.0] - 2021/2/21

    Feature:

    • Add support for:

    • Add new property to Niku (base):

      • on - Event listener
      • material - Add [Material] to Widget
      • inkWell - Add [InkWell] to Widget
      • border - Decorate with border using [Border]
    • Add group for flatButton, raisedButton, outlineButton and flatButton as package:niku/widget/button

    • Bug fixes:

      • Wrong spelling of documentation in several place
      • Prevent toolbarOptions from crashing if not specified all by adding default value
    Source code(tar.gz)
    Source code(zip)
  • 0.1.2(Feb 20, 2021)

  • 0.1.1(Feb 20, 2021)

Owner
SaltyAom
Take it easy!
SaltyAom
🔁 A custom refresh indicator for flutter.

Liquid Pull To Refresh A beautiful and custom refresh indicator for flutter highly inspired from Ramotion Pull Down to Refresh. Table of contents Inst

Ayush Agarwal 1.1k Dec 23, 2022
Flutter Infinite ListView - ListView with items that can be scrolled infinitely in both directions. Maintainer: @slightfoot

Flutter Infinite ListView ListView with items that can be scrolled infinitely in both directions. Quick Usage Replace your existing ListView with Infi

Flutter Community 257 Jan 8, 2023
scroll to index with fixed/variable row height inside Flutter scrollable widget

scroll-to-index This package provides the scroll to index mechanism for fixed/variable row height for Flutter scrollable widget. Getting Started In th

Quire 415 Jan 6, 2023
A Flutter package that builds a list view and notifies when the widgets are on screen.

inview_notifier_list A Flutter package that builds a ListView or CustomScrollView and notifies when the widgets are on screen within a provided area.

Vamsi Krishna 511 Dec 21, 2022
Flutter plugin that allows you to showcase your features on iOS and Android. 👌🔝🎉

ShowCaseView A Flutter package allows you to Showcase/Highlight your widgets step by step. It is inspired from Fluttery's Flutter challange. Preview I

Simform Solutions 1.1k Jan 7, 2023
Easily make Flutter apps responsive. Automatically adapt UI to different screen sizes. Responsiveness made simple. Demo: https://gallery.codelessly.com/flutterwebsites/minimal/

Responsive Framework Responsiveness made simple Responsive Framework adapts your UI to different screen sizes automatically. Create your UI once and h

Codelessly 931 Dec 25, 2022
Compare your design and current flutter layout.

pixel_perfect Put a semi-transparent image with the design over the top of the developed layout. It helps you to compare original design and current p

Kherel 45 Oct 24, 2022
This package allows you to draw dotted lines with Flutter. You can draw a beautiful dotted line.

This package allows you to draw dotted lines with Flutter. You can draw a beautiful dotted line.

Tushar Nikam 1 Feb 9, 2022
A flutter plugin for bluebooth ble device connect and control.

flutter_blue_elves A flutter plugin witch includes platform-specific implementation code for Android and/or iOS to connect and control bluetooth ble d

PineappleOilPrince 29 Dec 30, 2022
Device Preview For Flutter

Approximate how your app looks and performs on another device. Main features Preview any device from any device Change the device orientation Dynamic

null 3 May 14, 2022
NuConta Marketplace For Flutter

NuConta Marketplace telegram-cloud-document-1-5136388785566646724.mp4 Layout based in this drible project A Flutter project made using: Clean Dart tha

David Araujo 5 Nov 27, 2022
适用于 Flutter 的云片行为验证插件

flutter_yunpian_captcha 适用于 Flutter 的云片行为验证插件 屏幕截图 快速开始 安装 用法 获取 SDK 版本 初始化 SDK 开始验证 相关链接 许可证 屏幕截图 快速开始 安装 将此添加到包的 pubspec.yaml 文件中: dependencies: f

LeanFlutter 5 Mar 16, 2021
🎥 Movie app which is developed using flutter and powered by tmdb.

Fluttery Filmy ?? Movie app which is developed using flutter and powered by tmdb. Preview Screenshot Listing Screen Detail Screen What's next? Movies

Bhavik Makwana 197 Dec 28, 2022
Effortless Cryptocurrency Portfolio Tracker Application Built With Flutter

UNICOIN - DEVFEST HCMC 2021 Effortless Cryptocurrency Portfolio Tracker Application. Unicorn utilizes Coingecko's trusty API to track up-to-date data

null 5 Nov 9, 2022
Form builder image picker - Form builder image picker for flutter

form_builder_image_picker Field for picking image(s) from Gallery or Camera for

Ferri Sutanto 0 Jan 28, 2022
Responsive-Ui-builder - The responsive ui builder package contains widgets that helps you to create your UI responsive

Responsive Ui Builder Getting Started The responsive ui builder package contains

null 0 Feb 1, 2022
A simple app to demonstrate a testable, maintainable, and scalable architecture for flutter. flutter_bloc, hive, and REST API are some of the tech stacks used in this project.

last_fm A simple app to demonstrate a testable, maintainable, and scalable architecture for flutter. flutter_bloc, hive, and REST API are some of the

Elias Andualem 140 Dec 31, 2022
A simple app to demonstrate a testable, maintainable, and scalable architecture for flutter

A simple app to demonstrate a testable, maintainable, and scalable architecture for flutter. flutter_bloc, hive, and REST API are some of the tech stacks used in this project.

Elias Andualem 139 Dec 28, 2022
A property search app created using flutter

flutter_property_finder A property listings app built using Flutter sdk. Tutorial Link Watch as i guide you step by step on how to build this applicat

Emmanuel Okiche 68 Dec 13, 2022
Plist parser - A Plist parser for Flutter supports XML and binary Apple Property list (plist) formats

Plist Parser for Flutter ?? A Flutter Plugin for Plist parser supporting XML and

dirablue ( gaku ) 4 Nov 17, 2022