flutter

package module
v0.52.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 24, 2022 License: BSD-3-Clause Imports: 28 Imported by: 44

README

go-flutter - A package that brings Flutter to the desktop

Awesome Flutter Documentation Go Report Card

Purpose

Flutter allows you to build beautiful native apps on iOS and Android from a single codebase.

This unofficial project brings Flutter to the desktop through the power of Go and GLFW.

The flutter engine itself doesn't know how to deal with desktop platforms (eg handling mouse/keyboard input). Instead, it exposes an abstraction layer for whatever platform to implement. This project implements the Flutter's Embedding API using a single code base that runs on Windows, macOS, and Linux. For rendering, GLFW fits the job because it provides the right abstractions over the OpenGL's Buffer/Mouse/Keyboard for each platform.

The choice of Golang comes from the fact that it has the same tooling on every platform. Plus Golang is a great language because it keeps everything simple and readable, which makes it easy to build cross-platform plugins.

Screenshot of the Stocks demo app on macOS

Getting started

The best way to get started is to install hover, the official go-flutter tool to set up, build and run Flutter apps on the desktop, including hot-reload.

Read the hover tutorial to run your app on the desktop, or start with one of our example apps.

If you want more in-depth information about go-flutter, read the wiki.

Supported features

  • Linux 🐧
  • MacOS 🍎
  • Windows 🏁
  • Hot Reload
  • Plugin system
    • BinaryMessageCodec, BinaryMessageChannel
    • StandardMessageCodec, JSONMessageCodec
    • StandardMethodCodec, MethodChannel
  • Plugin detection for supported plugins
  • Importable as Go library into custom projects
  • UTF-8 Text input
  • Clipboard copy & paste
  • Window title and icon
  • Standard keyboard shortcuts
    • ctrl-c ctrl-v ctrl-x ctrl-a
    • Home End shift-Home shift-End
    • Left ctrl-Left ctrl-shift-Left
    • Right ctrl-Right ctrl-shift-Right
    • Backspace ctrl-Backspace Delete
  • Mouse-over/hovering
  • Mouse-buttons
  • RawKeyboard events
  • Distribution format (windows-msi, mac-dmg, linux-appimage, and more)
  • Cross-compiling using docker 🐳

Are you missing a feature? Open an issue!

Examples

A separate repository contains example Flutter apps that also run on the desktop. Go to github.com/go-flutter-desktop/examples to give them a try.

Plugins

Some popular plugins are already implemented over at github.com/go-flutter-desktop/plugins. If you have implemented a plugin that you would like to share, feel free to open a PR on the plugins repository!

For a detailed tutorial on how to create a plugin, read the wiki.

Version compatibility

Flutter version

Flutter itself is a relatively young project. Its framework and engine are updated often. The go-flutter project tries to stay compatible with the beta channel of Flutter.

Go version

Updating Go is simple and Go seldomly has backwards-incompatible changes. This project remains compatible with the latest Go stable release.

GLFW version

This project uses go-gl/glfw for GLFW v3.3.

License

BSD 3-Clause License

Documentation

Overview

Package flutter combines the embedder API with GLFW and plugins. Flutter and Go on the desktop.

go-flutter is in active development. API's must be considered beta and may be changed.

Index

Constants

View Source
const (
	// PopBehaviorNone means the system navigation pop event is ignored.
	PopBehaviorNone popBehavior = iota
	// PopBehaviorHide hides the application window on a system navigation pop
	// event.
	PopBehaviorHide
	// PopBehaviorIconify minimizes/iconifies the application window on a system
	// navigation pop event.
	PopBehaviorIconify
	// PopBehaviorClose closes the application on a system navigation pop event.
	PopBehaviorClose
)
View Source
const (
	// WindowModeDefault is the default window mode. Windows are created with
	// borders and close/minimize buttons.
	WindowModeDefault windowMode = iota
	// WindowModeBorderless removes decorations such as borders and
	// close/minimize buttons from the window.
	WindowModeBorderless
	// WindowModeBorderlessFullscreen starts the application in borderless
	// fullscreen mode. Currently, only fullscreen on the primary monitor is
	// supported. This option overrides WindowInitialDimensions. Note that on
	// some systems a fullscreen window is very hard to close. Make sure your
	// Flutter application has a close button and use PopBehaviorIconify to
	// minimize or PopBehaviorClose to close the application.
	WindowModeBorderlessFullscreen
	// WindowModeMaximize starts the application maximized.
	WindowModeMaximize
	// WindowModeBorderlessMaximize starts the application in borderless
	// maximize mode.
	WindowModeBorderlessMaximize
)

Variables

View Source
var (
	// ProjectVersion contains the version of the build
	ProjectVersion = "unknown"
	// ProjectVersion contains the version of the go-flutter been used
	PlatformVersion = "unknown"
	// ProjectName contains the application name
	ProjectName = "unknown"
	// ProjectOrganizationName contains the package org name, (Can by set upon flutter create (--org flag))
	ProjectOrganizationName = "unknown"
)

Compile configuration constants persistent across all flutter.Application. The values of config(option.go) can change between flutter.Run calls, those values contains informations that needs to be access globally, without requiring an flutter.Application.

Values overwritten by hover during the 'Compiling 'go-flutter' and plugins' phase.

Functions

func Run

func Run(opt ...Option) (err error)

Run executes a flutter application with the provided options. given limitations this method must be called by the main function directly.

Run(opt) is short for NewApplication(opt).Run()

Types

type Application

type Application struct {
	// contains filtered or unexported fields
}

Application provides the flutter engine in a user friendly matter.

func NewApplication

func NewApplication(opt ...Option) *Application

NewApplication creates a new application with provided options.

func (*Application) Run

func (a *Application) Run() error

Run starts the application and waits for it to finish.

type EventLoop added in v0.29.0

type EventLoop struct {
	// contains filtered or unexported fields
}

EventLoop is a event loop for the main thread that allows for delayed task execution.

func (*EventLoop) PostTask added in v0.29.0

func (t *EventLoop) PostTask(task embedder.FlutterTask, targetTimeNanos uint64)

PostTask posts a Flutter engine tasks to the event loop for delayed execution. PostTask must ALWAYS be called on the same goroutine/thread as `newEventLoop`

func (*EventLoop) RunOnCurrentThread added in v0.29.0

func (t *EventLoop) RunOnCurrentThread() bool

RunOnCurrentThread return true if tasks posted on the calling thread will be run on that same thread.

func (*EventLoop) WaitForEvents added in v0.29.0

func (t *EventLoop) WaitForEvents(rendererWaitEvents func(float64))

WaitForEvents waits for an any Rendering or pending Flutter Engine events and returns when either is encountered. Expired engine events are processed

type ExternalTextureHanlderFunc added in v0.29.0

type ExternalTextureHanlderFunc func(width int, height int) (bool, *PixelBuffer)

ExternalTextureHanlderFunc describes the function that handles external Texture on a given ID.

type Option

type Option func(*config)

Option for Application

func AddPlugin

func AddPlugin(p Plugin) Option

AddPlugin adds a plugin to the flutter application.

func ApplicationELFSnapshotPath added in v0.41.0

func ApplicationELFSnapshotPath(p string) Option

ApplicationELFSnapshotPath specify the path to the ELF AOT snapshot. only required by AOT.

func ApplicationICUDataPath

func ApplicationICUDataPath(p string) Option

ApplicationICUDataPath specify the path to the ICUData.

func BackOnEscape added in v0.44.0

func BackOnEscape(backOnEscape bool) Option

BackOnEscape controls the mapping of the escape key.

If true, pops the current route when escape is pressed. If false, escape is delivered to the application.

func ForcePixelRatio

func ForcePixelRatio(ratio float64) Option

ForcePixelRatio forces the the scale factor for the screen. By default, go-flutter will calculate the correct pixel ratio for the user, based on their monitor DPI. Setting this option is not advised.

func OptionVMArguments

func OptionVMArguments(a []string) Option

OptionVMArguments specify the arguments to the Dart VM.

func PopBehavior added in v0.17.0

func PopBehavior(p popBehavior) Option

PopBehavior sets the PopBehavior on the application

func ProjectAssetsPath

func ProjectAssetsPath(p string) Option

ProjectAssetsPath specify the flutter assets directory.

func ScrollAmount added in v0.37.0

func ScrollAmount(amount float64) Option

ScrollAmount sets the number of pixels to scroll with the mouse wheel

func VirtualKeyboardHide added in v0.31.0

func VirtualKeyboardHide(hideCallback func()) Option

VirtualKeyboardHide sets an func called when the flutter framework want to hide the keyboard.

func VirtualKeyboardShow added in v0.31.0

func VirtualKeyboardShow(showCallback func()) Option

VirtualKeyboardShow sets an func called when the flutter framework want to show the keyboard. This Option is interesting for people wanting to display the on-screen keyboard on TextField focus. It's up to the flutter developer to implement (or not) this function with the OS related call.

func WindowAlwaysOnTop added in v0.35.0

func WindowAlwaysOnTop(enabled bool) Option

WindowAlwaysOnTop sets the application window to be always on top of other windows

func WindowDimensionLimits added in v0.18.0

func WindowDimensionLimits(minWidth, minHeight, maxWidth, maxHeight int) Option

WindowDimensionLimits specify the dimension limits of the window. Does not work when the window is fullscreen or not resizable.

func WindowIcon

func WindowIcon(iconProivder func() ([]image.Image, error)) Option

WindowIcon sets an icon provider func, which is called during window initialization. For tips on the kind of images to provide, see https://godoc.org/github.com/go-gl/glfw/v3.3/glfw#Window.SetIcon

func WindowInitialDimensions

func WindowInitialDimensions(width, height int) Option

WindowInitialDimensions specify the startup's dimension of the window.

func WindowInitialLocation added in v0.29.0

func WindowInitialLocation(xpos, ypos int) Option

WindowInitialLocation specify the startup's position of the window. Location, in screen coordinates, of the upper-left corner of the client area of the window.

func WindowMode added in v0.18.0

func WindowMode(w windowMode) Option

WindowMode sets the window mode on the application.

func WindowTransparentBackground added in v0.39.0

func WindowTransparentBackground(enabled bool) Option

WindowTransparentBackground sets the init window background to be transparent

type PixelBuffer added in v0.29.0

type PixelBuffer struct {
	// Pix holds the image's pixels, in R, G, B, A order.
	Pix []uint8
	// Width and Height of the image's bounds
	Width, Height int
}

PixelBuffer is an in-memory (RGBA) image.

type Plugin

type Plugin interface {
	// InitPlugin is called during the startup of the flutter application. The
	// plugin is responsible for setting up channels using the BinaryMessenger.
	// If an error is returned it is printend the application is stopped.
	InitPlugin(messenger plugin.BinaryMessenger) error
}

Plugin defines the interface that each plugin must implement. When InitPlugin is called, the plugin may execute setup operations. The BinaryMessenger is passed to allow the plugin to register channels. A plugin may optionally implement PluginGLFW.

type PluginGLFW

type PluginGLFW interface {
	// Any type inmplementing PluginGLFW must also implement Plugin.
	Plugin
	// InitPluginGLFW is called after the call to InitPlugin. When an error is
	// returned it is printend the application is stopped.
	InitPluginGLFW(window *glfw.Window) error
}

PluginGLFW defines the interface for plugins that are GLFW-aware. Plugins may implement this interface to receive access to the *glfw.Window. Note that plugins must still implement the Plugin interface. The call to InitPluginGLFW is made after the call to InitPlugin.

PluginGLFW is separated because not all plugins need to know about glfw, Adding glfw.Window to the InitPlugin call would add glfw as dependency to every plugin implementation. Also, this helps in a scenarion where glfw is moved into a separate renderer/glfw package.

The PluginGLFW interface is not stable and may change at any time.

type PluginTexture added in v0.29.0

type PluginTexture interface {
	// Any type inmplementing PluginTexture must also implement Plugin.
	Plugin
	// InitPluginTexture is called after the call to InitPlugin. When an error is
	// returned it is printend the application is stopped.
	InitPluginTexture(registry *TextureRegistry) error
}

PluginTexture defines the interface for plugins that needs to create and manage backend textures. Plugins may implement this interface to receive access to the TextureRegistry. Note that plugins must still implement the Plugin interface. The call to PluginTexture is made after the call to PluginGLFW.

PluginTexture is separated because not all plugins need to send raw pixel to the Flutter scene.

type Texture added in v0.29.0

type Texture struct {
	ID int64
	// contains filtered or unexported fields
}

Texture is an identifier for texture declaration

func (*Texture) FrameAvailable added in v0.29.0

func (t *Texture) FrameAvailable() error

FrameAvailable mark a texture buffer is ready to be draw in the flutter scene

func (*Texture) Register added in v0.29.0

func (t *Texture) Register(handler ExternalTextureHanlderFunc) error

Register registers a textureID with his associated handler

func (*Texture) UnRegister added in v0.29.0

func (t *Texture) UnRegister() error

UnRegister unregisters a textureID with his associated handler

type TextureRegistry added in v0.29.0

type TextureRegistry struct {
	// contains filtered or unexported fields
}

TextureRegistry is a registry entry for a managed Texture.

func (*TextureRegistry) NewTexture added in v0.29.0

func (t *TextureRegistry) NewTexture() Texture

NewTexture creates a new Texture

Directories

Path Synopsis
Package embedder wraps the Flutter Embedder C API to Go.
Package embedder wraps the Flutter Embedder C API to Go.
internal
currentthread
Package currentthread gives you access to the underlying C thread id.
Package currentthread gives you access to the underlying C thread id.
debounce
Package debounce provides a debouncer func.
Package debounce provides a debouncer func.
opengl
Package opengl wraps the go-gl/gl OpenGL bindings with a compile-time OpenGL version selector.
Package opengl wraps the go-gl/gl OpenGL bindings with a compile-time OpenGL version selector.
Package plugin contains message codecs, method codecs and channel implementations which allow plugins to communicate between the flutter framework and the host (Go).
Package plugin contains message codecs, method codecs and channel implementations which allow plugins to communicate between the flutter framework and the host (Go).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL