Build Win32 apps with Dart!

Overview

Dart/Win32

A package that wraps some of the most common Win32 API calls using FFI to make them accessible to Dart code without requiring a C compiler or the Windows SDK.

pub package Language Build

In addition to exposing the APIs themselves, this package offers a variety of instructive examples for more complex FFI usage scenarios.

By design, this package provides minimal modifications to the Win32 API to support Dart idioms. The goal is to provide high familiarity to an existing Win32 developer. Other Dart packages may build on these primitives to provide a friendly API for Dart and Flutter developers. A good example of that is filepicker_windows, which offers a common item dialog suitable for incorporation into an existing Flutter app.

Usage

This package lets you write apps that use the Windows API directly from Dart, by wrapping common Win32, COM and Windows Runtime APIs using Dart FFI.

You could use it to call a Win32 API like EnumFontFamiliesEx to enumerate all locally-installed fonts:

Fonts screenshot

or access system information that is not exposed directly by the Dart framework libraries:

System information screenshot

You could use it to build a Windows app with Flutter that relies on Win32 APIs:

Disk explorer screenshot

You could even use it to build a traditional Win32 app, written purely in Dart, that could have come straight out of a classic Charles Petzold book on programming Windows apps:

Dart notepad screenshot

or even, perhaps, a fully-fledged game using GDI:

Dart Tetris for Win32 screenshot

You might even build a package that depends upon it, like dart_console, which enables advanced console manipulation:

Dart console ANSI color demo screenshot

or filepicker_windows, which provides a modern Windows file picker for Flutter:

Windows file picker screenshot

Getting started

Many more samples can be found in the example\ subdirectory, along with a test suite in the test\ subdirectory that shows other API calls.

A good starting point is hello.dart. This example demonstrates creating a Win32 window and responding to common messages such as WM_PAINT through a WindowProc callback function.

To run it, type:

dart example\hello.dart

This should display a window with a text message.

This can be compiled into a standalone Win32 executable by running:

dart compile exe example\hello.dart -o example\bin\hello.exe

For more information on working with the Win32 library from Dart, consult the documentation, in particular the sections on string manipulation and COM objects.

Samples

Dart samples

The package includes a number of examples in the example subdirectory. These examples use the Win32 API for all UI display and do not require Flutter.

Example Description
hello.dart Basic Petzoldian "hello world" Win32 app
bluetooth.dart Demonstrate enumerating Bluetooth devices
calendar.dart Gets information about the calendar from a WinRT API
console.dart Shows usage of console APIs
credentials.dart Adds a credential to the store and retrieves it
customwin.dart Displays a non-rectangular window
devices.dart Uses volume management APIs to list all disk devices
dialog.dart Create a custom dialog box in code
dialogshow.dart Creates a common item dialog (file picker) using COM
diskinfo.dart Use DeviceIoControl() for direct device operations
dump.dart Use debugger libraries to print DLL exported functions
dynamic_load.dart Demonstrate loading a DLL and calling it at runtime
filever.dart Getting file version information from the file resource
guid.dart Creates a globally unique identifier (GUID)
idispatch.dart Demonstrates calling a method using IDispatch
knownfolder.dart Retrieves known folders from the current user profile
manifest\ Demonstrates the use of app manifests for compiled apps
midi.dart Demonstrates MIDI playback using MCI commands
modules.dart Enumerates all loaded modules on the current system
monitor.dart Uses DDC and monitor-config API to get monitor caps
msgbox.dart Demonstrates a MessageBox from the console
notepad\ Lightweight replica of the Windows notepad applet
paint.dart Demonstrates simple GDI drawing and min/max window sizing
pipe.dart Shows use of named pipes for interprocess communication
play_sound.dart Plays a WAV file through the Windows PlaySound API
printer_list.dart Enumerate available printers on the Windows system
registry.dart Demonstrates querying the registry for values
screenshot.dart Takes a screenshot of the current desktop
scroll.dart Example of horizontal and vertical scrolling text window
sendinput.dart Sends keyboard and mouse input to another window
serial.dart Demonstrates serial port management
shortcut.dart Demonstrates creating a Windows shell link
snake.dart Snake game using various GDI features
sysinfo.dart Examples of getting device information from native C APIs
taskdialog.dart Demonstrates using modern task dialog boxes
tetris\main.dart Port of an open-source Tetris game to Dart
vt.dart Shows virtual terminal sequences
wallpaper.dart Shows what wallpaper and background color are set
window.dart Enumerates open windows and basic window manipulation
winmd.dart Interrogate Windows Runtime types
wmi.dart Using WMI from COM to retrieve device/OS information

Flutter samples

The explorer\ subdirectory contains an example of a simple Flutter app that uses the volume management Win32 APIs to find the disk drives connected to your computer and their volume IDs and attached paths.

Requirements

This package assumes the Dart 64-bit compiler, running on Windows. Many commands are tested on 32-bit Windows, but due to the lack of a compiler for 32-bit executables and the increasing lack of machines running 32-bit OSes, this is inevitably a low priority. The package is also tested on Windows-on-ARM architecture, running in x64 emulation mode.

Features and bugs

The current package only projects a subset of the Win32 API, but new APIs will be added based on user demand. I'm particularly interested in unblocking plugins for Windows. Please file feature requests and bugs at the issue tracker.

Backwards compatibility

The library version uses semver, but you should not assume a strict guarantee of no breaking changes between minor versions. That guarantee is not possible to make, for several reasons:

  • Several times, my fixing a bug in the fidelity of the Win32 API has tightened the constraints over a parameter (for example, Pointer becomes Pointer<INPUT>). These changes should be signalled in the log.
  • Adding new features may itself cause a breaking change. For example, if you declare a missing Windows constant in your own code that is then added, Dart will complain about the duplicate definition.

One solution is to pin to a specific version of Win32, or declare a more tightly-bounded version dependency (e.g. '>=1.7.0 <1.8.0' rather than merely ^1.7.0). But the best approach is simply to test regularly with the latest version of this package, and continue to move your minimum forward. As the package matures, these issues should gradually fade away.

Acknowledgements

The Tetris example listed above is a fuller worked example of a reasonably complete program that uses the Dart Win32 package. It is a port of a C version of the game by Chang-Hung Liang. More information...

The C implementation of Snake is by David Jones, and is ported with his permission.

The original C version of the Notepad example was authored by Charles Petzold, and is kindly licensed by him without restriction.

The summary Win32 API documentation comments are licensed by Microsoft under the Creative Commons Attribution 4.0 International Public License.

Comments
  • Add support for Windows App SDK instantiation

    Add support for Windows App SDK instantiation

    Would it be possible to create a sample of using project reunion with this and how to deploy it with a flutter app?

    The reason why this is important is that without project reunion creating things like full featured video players with DRM, OpenIdConnect authentication windows and the like is incredibly difficult with C++ (you have to get down into the Media Foundation layer which is brutally complex as an example) or downright impossible because it isn't accessible from win32.

    With this project and a project reunion sample, the sky's the limit and we can quickly backfill all of the existing functionality and reach parity with Android and iOS.

    Thanks!

    enhancement winrt 
    opened by jhancock4d 13
  • Bluetooth

    Bluetooth

    Thank you so much for sharing this repo :)

    I would like to provide thermal printing using bluetooth for a Flutter desktop app used on windows. It seems this could be achieved using the win32 API calls mentioned :

    • https://docs.microsoft.com/en-us/windows/win32/api/_bluetooth/

    Once implemented, it could also lead to a dedicated bluetooth repo similar to your filepicker_windows.

    enhancement help wanted 
    opened by flutter-painter 13
  • Provide a higher-level abstraction over `IDispatch`

    Provide a higher-level abstraction over `IDispatch`

    One day I had a problem, wanting to use SAPI in my application via COM. Now I have two problems. It would be nice if there was an extension on IDispatch which had some functions that accepted a List or something as arguments and automatically converted them to COM types and called the specified method or set the specified property. I saw the example/idispatch.dart wrapper class, but that doesn't seem to compile anymore and calling a method is still pretty complicated.

    enhancement help wanted 
    opened by Keithcat1 11
  • Memory management for WinRT Classes

    Memory management for WinRT Classes

    Originally posted by @halildurmus in https://github.com/timsneath/win32/issues/431#issuecomment-1133899087

    Assume that we're using the Mixin model for generating WinRT classes.

    There are some cases where we can't deallocate pointers in the generated code. Therefore, it is the consumers' responsibility to deallocate them once they're done using them.

    These are:

    • WinRT class pointers e.g. Calendar's pointer (these pointers are allocated by constructors such as Calendar's default constructor, factory constructors, methods, properties, or by consumers using ActivateObject or other helper methods)
    • WinRT mixin pointers e.g. pointers of the ICalendar and ITimeZoneOnCalendar
    • APIs that return IVector<T extends IInspectable> or IVectorView<T extends IInspectable> e.g. IVector<StorageFile>. As of now, these are exposed as Pointer<COMObject>. We only auto-generate APIs that return IVector<String> and IVectorView<String> at the moment but we will add support for these in the future. Here is the one I manually generated.

    ...and probably much more in the future as the WinRT projection matures (asynchronous APIs, IMap & IMapView...).

    The problem is that there are many situations where the consumers need to free pointers manually and I think it is pretty common to forget freeing some of the pointers (especially if you're using a lot of them). Another thing that is quite painful to deal with is that if you accidentally call free method twice on the same pointer, the process will crash and good luck figuring out the source of the problem (I got bitten by this many times :( ).

    I've been trying to find a way to fix these issues for the past few days and I have some ideas I'd like to share with you.

    I'll start with the first design. We could consider introducing a class that manages the pointers that could not be freed in the generated code:

    class WinRTAllocator {
      static final allocator = Arena();
    
      /// Releases all resources managed by the [allocator].
      static void freeAll() => allocator.releaseAll(reuse: true);
    }
    

    This class would contain a static allocator to be used by the generated code and a static method to free all pointers. We would expose this to the outside world so that the consumers would have a way of freeing all pointers by calling just a single method once they're done using WinRT APIs.

    Here are the cases where we need to modify the generator to use this allocator:

    • WinRT class pointers
    • WinRT mixin pointers (We would pass WinRTAllocator.allocator to toInterface method as a parameter)
    • APIs that return IVector<T extends IInspectable> or IVectorView<T extends IInspectable>

    ...and much more in the future...

    This design is much simpler to use, but if consumers use WinRT APIs heavily, I'm worried that the memory usage may be higher until they call WinRTAllocator.freeAll() (there may be some cases where the consumer is using tightly coupled APIs and because of this they can't call freeAll method between calls and must wait for all calls to complete).

    To solve this, here is the final design I came up with. First, we could create our own Arena implementation by slightly modifying dart:ffi's implementation to allow freeing specific pointers from the _managedMemoryPointers list (by modifying Arena's free method):

    class WinRTAllocator {
      static final allocator = _Arena();
    
      /// Releases memory allocated on the native heap.
      static void free(Pointer<NativeType> pointer) => allocator.free(pointer);
    
      /// Releases all resources managed by the [allocator].
      static void freeAll() => allocator.releaseAll(reuse: true);
    }
    
    class _Arena implements Allocator {
      /// The [Allocator] used for allocation and freeing.
      final Allocator _wrappedAllocator;
    
      /// Native memory under management by this [Arena].
      final List<Pointer<NativeType>> _managedMemoryPointers = [];
    
      /// Callbacks for releasing native resources under management by this [Arena].
      final List<void Function()> _managedResourceReleaseCallbacks = [];
    
      bool _inUse = true;
    
      /// Creates a arena of allocations.
      ///
      /// The [allocator] is used to do the actual allocation and freeing of
      /// memory. It defaults to using [calloc].
      _Arena([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
    
      /// Allocates memory and includes it in the arena.
      ///
      /// Uses the allocator provided to the [Arena] constructor to do the
      /// allocation.
      ///
      /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
      /// satisfied.
      @override
      Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
        _ensureInUse();
        final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
        _managedMemoryPointers.add(p);
        return p;
      }
    
      /// Registers [resource] in this arena.
      ///
      /// Executes [releaseCallback] on [releaseAll].
      ///
      /// Returns [resource] again, to allow for easily inserting
      /// `arena.using(resource, ...)` where the resource is allocated.
      T using<T>(T resource, void Function(T) releaseCallback) {
        _ensureInUse();
        releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
        _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
        return resource;
      }
    
      /// Registers [releaseResourceCallback] to be executed on [releaseAll].
      void onReleaseAll(void Function() releaseResourceCallback) {
        _managedResourceReleaseCallbacks.add(releaseResourceCallback);
      }
    
      /// Releases all resources that this [Arena] manages.
      ///
      /// If [reuse] is `true`, the arena can be used again after resources
      /// have been released. If not, the default, then the [allocate]
      /// and [using] methods must not be called after a call to `releaseAll`.
      ///
      /// If any of the callbacks throw, [releaseAll] is interrupted, and should
      /// be started again.
      void releaseAll({bool reuse = false}) {
        if (!reuse) {
          _inUse = false;
        }
        // The code below is deliberately wirtten to allow allocations to happen
        // during `releaseAll(reuse:true)`. The arena will still be guaranteed
        // empty when the `releaseAll` call returns.
        while (_managedResourceReleaseCallbacks.isNotEmpty) {
          _managedResourceReleaseCallbacks.removeLast()();
        }
        for (final p in _managedMemoryPointers) {
          _wrappedAllocator.free(p);
        }
        _managedMemoryPointers.clear();
      }
    
      /// Releases memory allocated on the native heap.
      @override
      void free(Pointer<NativeType> pointer) {
        final isRemoved = _managedMemoryPointers.remove(pointer);
        if (isRemoved) _wrappedAllocator.free(pointer);
      }
    
      void _ensureInUse() {
        if (!_inUse) {
          throw StateError(
              'Arena no longer in use, `releaseAll(reuse: false)` was called.');
        }
      }
    }
    

    (I'd like to point out that calling WinRTAllocator's free multiple times on the same pointer won't crash your process as the implementation checks if the pointer exists in the _managedMemoryPointers list before calling the native API.)

    Then, we could create a dispose method in IInspectable:

    class IInspectable extends IUnknown {
      ...
    
      /// Releases all memory allocated by this object.
      void dispose() => WinRTAllocator.free(ptr);
    }
    

    ...and modify WinRT classes and mixins like this:

    // icalendar.dart
    mixin ICalendar on IInspectable {
      late final ptrICalendar =
          toInterface(IID_ICalendar, allocator: WinRTAllocator.allocator);
      // ...
    }
    
    // itimezoneoncalendar.dart
    mixin ITimeZoneOnCalendar on IInspectable {
      late final ptrITimeZoneOnCalendar =
          toInterface(IID_ITimeZoneOnCalendar, allocator: WinRTAllocator.allocator);
      // ...
    }
    
    // calendar.dart
    class Calendar extends IInspectable with ICalendar, ITimeZoneOnCalendar {
      Calendar() : super(ActivateWinRTClass(_className));
      Calendar.fromPointer(super.ptr);
    
      static const _className = 'Windows.Globalization.Calendar';
    
      // ...
    
      @override
      void dispose() {
        WinRTAllocator.free(ptr);
        WinRTAllocator.free(ptrICalendar);
        WinRTAllocator.free(ptrITimeZoneOnCalendar);
      }
    }
    

    With this design, consumers have the flexibility to use the dispose method of the WinRT classes in combination with the freeAll method of the WinRTAllocator for memory management. They can decide which option is more suitable for their needs or preferences. Some might prefer to just use freeAll for its simplicity while others may use both of them to make their applications more efficient.

    winrt 
    opened by timsneath 10
  • Simple input dialog

    Simple input dialog

    I've searched around, tried some of the examples. Very cool stuff!

    Is there a way to show a simple input dialog? I am looking for a small window that a user can type into and return the value for use. Something like:

    int timerDuration = getInput();

    and the user could type 5 so a 5 minute timer could be set.

    enhancement 
    opened by Merrit 10
  • Add wincred.h

    Add wincred.h

    I am interested in using wincred.h: https://docs.microsoft.com/en-us/windows/win32/api/wincred/nf-wincred-credwritea to port my plugin to windows.

    Do you have any plans to add support for it - or how much work is it? I'm not completely sure how much magic is autogenerated and what has to be manually added :-)

    enhancement help wanted 
    opened by hpoul 10
  • Simplify using `WinRT` classes

    Simplify using `WinRT` classes

    Created this issue to continue our discussion at https://github.com/timsneath/win32/issues/423.

    I love this. I wonder: as we're starting to it should be Calendar() rather than using the factory Calendar.create(). That feels more idiomatic.

    I agree. In that case, we could generate activatable WinRT classes this way:

    class Calendar extends IInspectable with ICalendar, ITimeZoneOnCalendar {
      Calendar() : super(ActivateWinRTClass('Windows.Globalization.Calendar'));
    
      Calendar.fromPointer(super.ptr);
    }
    

    That will cause a cascading breaking change for traditional COM interfaces though, and I'm not sure how to get around that. Perhaps they need to become factory constructors themselves, with IFileOpenDialog.cast(myComObject) or something. We should probably move this dialog into a separate design doc

    Yeah, this will be difficult to do for COM interfaces.

    In the meantime, I'm going to merge this, since it's obviously in the same vein as trustLevel and runtimeClassName. Maybe we'll hide these from the "outside world" later on. It looks like that's what C# does.

    Hiding them might be a good idea. Looks like C#/WinRT only exposes GetRuntimeClassName method to consumers.

    winrt 
    opened by halildurmus 9
  • shobjidl_core.h

    shobjidl_core.h

    opened by youk 9
  •  Compilation fails with 'InvalidType doesn't have nullability'

    Compilation fails with 'InvalidType doesn't have nullability'

    /root/.pub-cache/hosted/pub.dartlang.org/win32-1.7.1/lib/src/generated/IWbemServices.dart:495:15: Error: 'NativeFunction' isn't a type. Pointer<NativeFunction<_ExecMethod_Native>>.fromAddress( ^^^^^^^^^^^^^^ /root/.pub-cache/hosted/pub.dartlang.org/win32-1.7.1/lib/src/generated/IWbemServices.dart:495:7: Error: Method not found: 'Pointer.fromAddress'. Pointer<NativeFunction<_ExecMethod_Native>>.fromAddress( ^^^^^^^^^^^

    opened by aTeamSolace 9
  • Win32 audio player feature request

    Win32 audio player feature request

    Hi, I was wondering how simple it would be to implement the audio api from win32 https://docs.microsoft.com/en-us/windows/win32/coreaudio/about-the-windows-core-audio-apis It's quite large, but enables fully-featured audio and music players on windows

    enhancement question 
    opened by SwissCheese5 9
  • Manually project `IVector` and `IVectorView`

    Manually project `IVector` and `IVectorView`

    Currently, the only supported types are String and WinRT types such as IHostName.

    I found the types that IVector and IVectorView support in here.

    From the link above, the types that IVector and IVectorView support are WinRT types, primitive types like String, int, bool etc., and also some structs like GUID, Point, Size, DateTime, Uri etc.

    I looked into the WinMD files using ILSpy and the majority of the APIs returns IVector<String> or IVector<T extends IInspectable>. This is also the case for IVectorView. That's why I didn't add support for the remaining types and some of them were structs like GUID, Point which I don't know how to project them. We can add support for them in the future.

    While adding support for generic types, I had to find a way to create constructors from generic T types. In the beginning, I was storing the constructor tear-off mappings for T types inside a Map like this:

      static const map = <Type, IInspectable Function(Pointer<COMObject>)>{
        IHostName: IHostName.new,
        IStorageFile: IStorageFile.new,
        ...
      };
    

    After learning the number of types that IVectorView supports -- which is more than 300, I abandoned this plan and added a creator parameter to constructors of IVector and IVectorView.

    This parameter is only required for WinRT types like IVector<IHostName> and as I assume we will convert methods or properties that return Pointer<COMObject> to their respective types such as IVector or IVectorView(we're gonna expose this as a List, but first we're gonna turn this into an IVectorView in the generated code), the consumers won't have to deal with this which is great.

    I'm looking forward to hearing your thoughts on this.

    EDIT: I just figured out how to use IIterable and IIterator. I won't include them in this since this PR has grown quite a bit already.

    opened by halildurmus 8
  • Could I call Windows built in OCR API by this package?

    Could I call Windows built in OCR API by this package?

    I want to call Windows.Media.Ocr in my flutter desktop application. Could I simply add this package to my project? And are there any demo codes from this function? Thank you.

    enhancement blocked winrt 
    opened by HaloWang 1
  • support RasDialA ?

    support RasDialA ?

    support RasDialA ?

    see https://docs.microsoft.com/zh-cn/windows/win32/api/ras/nf-ras-rasdiala?redirectedfrom=MSDN and https://stackoverflow.com/a/11616990

    enhancement question 
    opened by shangjiyu 2
  • `midiInOpen` takes a Pointer to a callback but `Cannot invoke native callback outside an isolate`

    `midiInOpen` takes a Pointer to a callback but `Cannot invoke native callback outside an isolate`

    I'm trying to connect my MIDI device to a Flutter app running on Windows. I have the following:

    final Pointer<HMIDIIN> hMidiDevice = malloc();
    
    Pointer<NativeFunction<MidiInProc>> callbackPointer =
    	Pointer.fromFunction(midiInCallback);
    
    final result = midiInOpen(
      hMidiDevice,
      0,
      callbackPointer.address,
      0,
      CALLBACK_FUNCTION,
    );
    midiInStart(hMidiDevice.value);
    

    midiInOpen takes a pointer to a function as 3rd argument. Here is my callback method:

    static void midiInCallback(
    	int hMidiIn,
    	int wMsg,
    	int dwInstance,
    	int dwParam1,
    	int dwParam2,
    ) {
    	print('Message: $wMsg dwParam1: $dwParam1');
    }
    

    This compiles and works with a connected USB MIDI device. However, when I press a key on my MIDI device, then I get the following error:

    ../../third_party/dart/runtime/vm/runtime_entry.cc: 3657: error: Cannot invoke native callback outside an isolate.
    pid=11004, thread=21860, isolate_group=(nil)(0000000000000000), isolate=(nil)(0000000000000000)
    isolate_instructions=0, vm_instructions=7ffef50837c0
      pc 0x00007ffef51a3732 fp 0x00000057468ff990 angle::PlatformMethods::operator=+0x322d8a
    -- End of DumpStackTrace
    

    What am I doing wrong?

    bug blocked 
    opened by akvus 1
  • SetWindowsHookEx on Flutter!

    SetWindowsHookEx on Flutter!

    Hello,

    I've gone through several examples and tried running a lot of them. It's quite difficult to understand how a lot of this interacts with flutter. Is there an example I could follow for SetWindowsHookEx for flutter? I have seen https://github.com/timsneath/win32/issues/509 and it doesn't really explain how it would work in flutter without creating a extra window!

    opened by sagar448 0
  • This package will support WinRT ```NetworkOperatorTetheringManager```?

    This package will support WinRT ```NetworkOperatorTetheringManager```?

    Hi, nowadays i use a powershell script run by my flutter app to get thetering state, precisely NetworkOperatorTetheringManager.TheteringOperationalState. Full support of this api would also add possibility to start and stop tethering. https://docs.microsoft.com/en-us/uwp/api/windows.networking.networkoperators.networkoperatortetheringmanager?view=winrt-22621

    enhancement winrt 
    opened by chrias 0
Owner
Tim Sneath
By day I herd cats and build high-productivity tools for developers. By night I play with code.
Tim Sneath
Stream Feed official Flutter SDK. Build your own feed experience using Dart and Flutter.

Official Flutter packages for Stream Activity Feeds The official Dart client for Stream Activity Feeds, a service for building activity feed applicati

Stream 67 Sep 26, 2022
Build dart types from GraphQL schemas and queries

Artemis Build dart types from GraphQL schemas and queries Check the beta branch for the bleeding edge (and breaking) stuff. Artemis is a code generato

Igor Borges 481 Nov 27, 2022
Pensil Community official Flutter SDK. Build your own community experience using Dart and Flutter.

Official flutter package for Pensil The official Dart client for Pensil communities, a service for building communites applications. This library can

Pensil Inc 6 Oct 6, 2022
Nakama is an open-source server designed to power modern games and apps

Nakama is an open-source server designed to power modern games and apps. Features include user accounts, chat, social, matchmaker, realtime multiplayer, and much more.

Allan Nava 85 Dec 30, 2022
Berikut merupakan source code Chat Apps dengan Flutter + GetX + Firebase

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

Sandikha Rahardi 52 Dec 31, 2022
Starter app for Flutter that includes many different production app features; some not typically included in demo apps.

first_app: Starter app for a Flutter production app Maintainer: Greger Wedel, https://github.com/gregertw Listed on: Latest build and artifacts: ** La

Greger Teigre Wedel 373 Jan 8, 2023
This plugin allows Flutter desktop apps to resizing and repositioning the window.

window_manager This plugin allows Flutter desktop apps to resizing and repositioning the window. window_manager Platform Support Quick Start Installat

LeanFlutter 346 Jan 3, 2023
This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut).

hotkey_manager This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut). hotkey_manager Platform Support Quick Star

LeanFlutter 81 Dec 21, 2022
Windows95 UI components for Flutter apps. Bring back the nostalgic look and feel of old operating systems with this set of UI components ready to use.

Flutter95 Windows95 UI components for Flutter apps. UNDER CONSTRUCTION Screenshots Components Scaffold95 Scaffold as a Windows95 styled window. Provid

Miguel Beltran 141 Jan 2, 2023
WallHalla is a wallpapers apps made with flutter and unsplash.com API

WallHalla is a wallpapers apps made with flutter and unsplash.com API

null 5 Dec 22, 2022
An admin panel aplication written with Flutter, aiming work with apps responsiveness.

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

Samilly Nunes 2 Oct 23, 2021
A MVVM architecture and project structure approaches to developing Flutter apps

Flutter Architecture Blueprints Flutter Architecture Blueprints is a project that introduces MVVM architecture and project structure approaches to dev

zulfi007 4 Mar 18, 2022
Super Fast Cross Platform Database for Flutter & Web Apps

Isar Database ?? Alpha version - Use with care. ?? Quickstart • Documentation • Sample Apps • Support & Ideas • Pub.dev Isar [ee-zahr]: River in Bavar

Isar Database 2.1k Jan 1, 2023
Android app to show movie ratings when browsing Netflix, Amazon Prime Video and other supported video streaming apps on the phone

Flutter - Movie Ratings You can get the latest Playstore version here on Playstore - or download directly - 0.4.5 Screenshots of master Search Page Fa

Jay Rambhia 71 Nov 23, 2022
A collection of simple, bare-bones Flutter apps that each demonstrate a concept

flutter-by-example A collection of simple, bare-bones Flutter apps that each demonstrate a concept The apps are slowly being updated to Dart 2; be sur

Matt Sullivan 1k Dec 10, 2022
🔥 A collection of Firebase plugins for Flutter apps.

FlutterFire FlutterFire is a set of Flutter plugins that enable Flutter apps to use Firebase services. You can follow an example that shows how to use

null 7.4k Dec 31, 2022
An Ultimate Approach For Flutter Mobile Apps

?? Latest version v1.2.3 ?? Changelog: https://inspireui.notion.site/FluxBuilder-f23547be583e47838da6eb3097944d3f FluxBuilder is a drag-and-draw tool

InspireUI 224 Dec 22, 2022
Amazing task management application with fluid, minimal and modern UI using Flutter! One of The Winner Apps for Google DevFest 2021!

Orb "Let your task orbit!" ?? Description Orb is an easy-to-use task manager app that help you manage your daily struggles to get your things done eff

Tom Huynh 9 Oct 28, 2022
Chatty - A Slicing UI Practice Chat UI Apps (Chatty). From pixels BWA website

chatty A Slicing UI Practice Chat UI Apps (Chatty). From pixels BWA website. ??

Latoe 14 Dec 7, 2022