Full Code of go-flutter-desktop/examples for AI

master 031d1c2c5e54 cached
150 files
255.0 KB
83.9k tokens
210 symbols
1 requests
Download .txt
Showing preview only (291K chars total). Download the full file or copy to clipboard to get everything.
Repository: go-flutter-desktop/examples
Branch: master
Commit: 031d1c2c5e54
Files: 150
Total size: 255.0 KB

Directory structure:
gitextract_wdz4x0ao/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── draggable_borderless/
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── keyboard_event/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── plugin_tutorial/
│   ├── .gitignore
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── go-plugin-example/
│   │   ├── battery/
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   └── complex/
│   │       ├── go.mod
│   │       ├── go.sum
│   │       └── main.go
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── pointer_demo/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── renovate.json
├── stocks/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── hover.yaml
│   │   └── packaging/
│   │       ├── darwin-bundle/
│   │       │   └── {{.applicationName}} {{.version}}.app/
│   │       │       └── Contents/
│   │       │           └── Info.plist.tmpl
│   │       ├── darwin-pkg/
│   │       │   └── flat/
│   │       │       ├── Distribution.tmpl
│   │       │       └── base.pkg/
│   │       │           └── PackageInfo.tmpl
│   │       ├── linux-appimage/
│   │       │   ├── AppRun.tmpl
│   │       │   └── {{.packageName}}.desktop.tmpl
│   │       ├── linux-deb/
│   │       │   ├── DEBIAN/
│   │       │   │   └── control.tmpl
│   │       │   └── usr/
│   │       │       ├── bin/
│   │       │       │   └── {{.executableName}}.tmpl
│   │       │       └── share/
│   │       │           └── applications/
│   │       │               └── {{.executableName}}.desktop.tmpl
│   │       ├── linux-pkg/
│   │       │   ├── PKGBUILD.tmpl
│   │       │   └── src/
│   │       │       └── usr/
│   │       │           ├── bin/
│   │       │           │   └── {{.executableName}}.tmpl
│   │       │           └── share/
│   │       │               └── applications/
│   │       │                   └── {{.executableName}}.desktop.tmpl
│   │       ├── linux-rpm/
│   │       │   ├── BUILDROOT/
│   │       │   │   └── {{.packageName}}-{{.version}}-{{.release}}.x86_64/
│   │       │   │       └── usr/
│   │       │   │           ├── bin/
│   │       │   │           │   └── {{.executableName}}.tmpl
│   │       │   │           └── share/
│   │       │   │               └── applications/
│   │       │   │                   └── {{.executableName}}.desktop.tmpl
│   │       │   └── SPECS/
│   │       │       └── {{.packageName}}.spec.tmpl
│   │       ├── linux-snap/
│   │       │   └── snap/
│   │       │       ├── local/
│   │       │       │   └── {{.executableName}}.desktop.tmpl
│   │       │       └── snapcraft.yaml.tmpl
│   │       └── windows-msi/
│   │           ├── upgrade-code.txt
│   │           └── {{.packageName}}.wxs.tmpl
│   ├── lib/
│   │   ├── i18n/
│   │   │   ├── .dartignore
│   │   │   ├── regenerate.md
│   │   │   ├── stock_messages_all.dart
│   │   │   ├── stock_messages_en.dart
│   │   │   ├── stock_messages_es.dart
│   │   │   ├── stocks_en.arb
│   │   │   └── stocks_es.arb
│   │   ├── main.dart
│   │   ├── main_desktop.dart
│   │   ├── stock.dart
│   │   ├── stock_arrow.dart
│   │   ├── stock_data.dart
│   │   ├── stock_home.dart
│   │   ├── stock_list.dart
│   │   ├── stock_row.dart
│   │   ├── stock_settings.dart
│   │   ├── stock_strings.dart
│   │   ├── stock_symbol_viewer.dart
│   │   └── stock_types.dart
│   └── pubspec.yaml
├── text_demo/
│   ├── .gitignore
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── texture_tutorial/
│   ├── .gitignore
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── go-texture-example/
│   │   ├── gif/
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   └── image/
│   │       ├── go.mod
│   │       ├── go.sum
│   │       └── main.go
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
└── xbox_controller/
    ├── .gitignore
    ├── README.md
    ├── fonts/
    │   └── Roboto/
    │       └── LICENSE.txt
    ├── go/
    │   ├── .gitignore
    │   ├── cmd/
    │   │   ├── import-path_provider-plugin.go
    │   │   ├── main.go
    │   │   └── options.go
    │   ├── go.mod
    │   ├── go.sum
    │   └── hover.yaml
    ├── go-plugin-example/
    │   └── controller/
    │       ├── go.mod
    │       ├── go.sum
    │       └── main.go
    ├── lib/
    │   ├── game.dart
    │   ├── main.dart
    │   └── main_desktop.dart
    └── pubspec.yaml

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/main.yml
================================================
name: Github Actions

on:
  schedule:
    - cron: "0 0 * * 1"
  push:
    branches: [master]
  pull_request:
    branches: [master]

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        format: [darwin-dmg, darwin-pkg, darwin, linux-appimage, linux-deb, linux-pkg, linux-rpm, linux-snap, linux, windows-msi, windows]
    container:
      image: goflutter/hover:v0.47.2

    steps:
      - name: Update flutter
        run: |
          apt-get update
          apt-get install -y unzip
          flutter upgrade
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Run `hover build ${{ matrix.format }}`
        run: |
          cd $GITHUB_WORKSPACE
          export VERSION_NAME=$(git describe --tags $(git rev-list --tags --max-count=1))
          cd stocks && hover build ${{ matrix.format }} --version-number ${VERSION_NAME} --debug
          ls -lah ./go/build/outputs/${{ matrix.format }}-debug_unopt/*
      - uses: actions/upload-artifact@v2
        with:
          name: ${{ matrix.format }}
          path: stocks/go/build/outputs/${{ matrix.format }}-debug_unopt/*


================================================
FILE: .gitignore
================================================
.idea
*.iml
.flutter-plugins-dependencies


================================================
FILE: .gitlab-ci.yml
================================================
stages:
  - build

# .hoverBuildPackaged is a template job that we re-use for a number of concrete
# build jobs. This allows us to have a single job definition that is re-used for
# all the separate targets.
.hoverBuildPackaged:
  stage: build
  image: goflutter/hover:v0.47.2
  cache:
    key: one-key-4-all
    paths:
      - /root/.pub-cache
      - /root/.cache/go-build
  script:
    - declare -x VERSION_NAME=$(git describe --tags | sed 's/-//g')
    - cd stocks && hover build ${PACKAGING_TYPE} --version-number ${VERSION_NAME}
  artifacts:
    paths:
      - stocks/go/build/outputs/${PACKAGING_TYPE}
    expire_in: 20 weeks

## Build

build:darwin-dmg:
  variables:
    PACKAGING_TYPE: darwin-dmg
  extends: .hoverBuildPackaged

build:darwin-pkg:
  variables:
    PACKAGING_TYPE: darwin-pkg
  extends: .hoverBuildPackaged

build:linux-appimage:
  variables:
    PACKAGING_TYPE: linux-appimage
  extends: .hoverBuildPackaged

build:linux-deb:
  variables:
    PACKAGING_TYPE: linux-deb
  extends: .hoverBuildPackaged

build:linux-rpm:
  variables:
    PACKAGING_TYPE: linux-rpm
  extends: .hoverBuildPackaged

build:linux-pkg:
  variables:
    PACKAGING_TYPE: linux-pkg
  extends: .hoverBuildPackaged

build:linux-snap:
  variables:
    PACKAGING_TYPE: linux-snap
  extends: .hoverBuildPackaged

build:windows-msi:
  variables:
    PACKAGING_TYPE: windows-msi
  extends: .hoverBuildPackaged


================================================
FILE: README.md
================================================
# go-flutter-desktop/examples

This repository contains some example applications that can be built using [go-flutter](https://github.com/go-flutter-desktop/go-flutter).

## Compiled example ![Github Actions](https://github.com/go-flutter-desktop/examples/workflows/Github%20Actions/badge.svg)  
Pre-compiled examples are available as [Github action](https://github.com/go-flutter-desktop/examples/actions) artifacts.  

## Getting started

### Install dependencies

You'll need to have the following tools installed on your machine.

- [flutter](https://flutter.dev)
- [go](https://golang.org)
- [hover](https://github.com/go-flutter-desktop/hover)

### Run the example

```bash
git clone https://github.com/go-flutter-desktop/examples.git
cd examples/[.....] # select an example project
hover run
```

## Issues

Please report issues at the [go-flutter issue tracker](https://github.com/go-flutter-desktop/go-flutter/issues/).


================================================
FILE: draggable_borderless/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: draggable_borderless/.metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: bc7bc940836f1f834699625426795fd6f07c18ec
  channel: beta

project_type: app


================================================
FILE: draggable_borderless/README.md
================================================
# draggable_borderless

A [go-flutter-desktop](https://github.com/go-flutter-desktop/go-flutter/wiki/Plugin-info) GLFW plugin example.  
In this example we are answering issue [#214](https://github.com/go-flutter-desktop/go-flutter/issues/214): *"how to drag undecorated window".*  

go-flutter has multiples [option](https://github.com/go-flutter-desktop/go-flutter/wiki/Options), one of them been [`flutter.WindowMode(flutter.WindowModeBorderless)`](https://github.com/go-flutter-desktop/examples/blob/f6eddd4e0051944ab41b0a9e12d8a4a0d0af2fdd/draggable_borderless/desktop/cmd/options.go#L11).  
This example uses this option, which hide the window decoration (title bar, close/maximize/.. buttons) making the window un-draggable using 'classic' mouse interaction. 

To solve this limitation a [`GLFW-Plugin`](https://github.com/go-flutter-desktop/go-flutter/wiki/GLFW-Plugin-example) has been written.

The GLFW answer comes from https://stackoverflow.com/a/46205940 with a little
twist.  
The window is only draggable from the [Flutter AppBar](https://api.flutter.dev/flutter/material/AppBar-class.html) widget.

The source code of the plugin has been placed directly in the [`go/cmd/options.go`](./go/cmd/options.go) file.  
A custom `AppBar` widget has been created, the source code is available in the
[`lib/main_desktop.dart`](./lib/main_desktop.dart) file.

## Demo
<p align="center">
  <img src="./app_bar_drag.gif" width="650" align="center" alt="Demo of the
  example">
</p>


================================================
FILE: draggable_borderless/go/.gitignore
================================================
build
.last_goflutter_check
.last_go-flutter_check


================================================
FILE: draggable_borderless/go/cmd/main.go
================================================
package main

import (
	"fmt"
	"image"
	_ "image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/go-flutter-desktop/go-flutter"
	"github.com/pkg/errors"
)

// vmArguments may be set by hover at compile-time
var vmArguments string

func main() {
	// DO NOT EDIT, add options in options.go
	mainOptions := []flutter.Option{
		flutter.OptionVMArguments(strings.Split(vmArguments, ";")),
		flutter.WindowIcon(iconProvider),
	}
	err := flutter.Run(append(options, mainOptions...)...)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func iconProvider() ([]image.Image, error) {
	execPath, err := os.Executable()
	if err != nil {
		return nil, errors.Wrap(err, "failed to resolve executable path")
	}
	execPath, err = filepath.EvalSymlinks(execPath)
	if err != nil {
		return nil, errors.Wrap(err, "failed to eval symlinks for executable path")
	}
	imgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), "assets", "icon.png"))
	if err != nil {
		return nil, errors.Wrap(err, "failed to open assets/icon.png")
	}
	img, _, err := image.Decode(imgFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode image")
	}
	return []image.Image{img}, nil
}


================================================
FILE: draggable_borderless/go/cmd/options.go
================================================
package main

import (
	"github.com/go-flutter-desktop/go-flutter"
	"github.com/go-flutter-desktop/go-flutter/plugin"
	"github.com/go-gl/glfw/v3.3/glfw"
)

var options = []flutter.Option{
	flutter.WindowInitialDimensions(400, 300),
	flutter.WindowMode(flutter.WindowModeBorderless),
	flutter.AddPlugin(&AppBarDraggable{}),
}

// AppBarDraggable is a plugin that makes moving the bordreless window possible
type AppBarDraggable struct {
	window           *glfw.Window
	cursorPosY       int
	cursorPosX       int
}

var _ flutter.Plugin = &AppBarDraggable{}     // compile-time type check
var _ flutter.PluginGLFW = &AppBarDraggable{} // compile-time type check
// AppBarDraggable struct must implement InitPlugin and InitPluginGLFW

// InitPlugin creates a MethodChannel for "samples.go-flutter.dev/draggable"
func (p *AppBarDraggable) InitPlugin(messenger plugin.BinaryMessenger) error {
	channel := plugin.NewMethodChannel(messenger, "samples.go-flutter.dev/draggable", plugin.StandardMethodCodec{})
	channel.HandleFunc("onPanStart", p.onPanStart)
	channel.HandleFuncSync("onPanUpdate", p.onPanUpdate) // MUST RUN ON THE MAIN THREAD (use of HandleFuncSync)
	channel.HandleFunc("onClose", p.onClose)
	return nil
}

// InitPluginGLFW is used to gain control over the glfw.Window
func (p *AppBarDraggable) InitPluginGLFW(window *glfw.Window) error {
	p.window = window
	return nil
}

// onPanStart/onPanUpdate a golang / flutter implemantation of:
// "GLFW how to drag undecorated window without lag"
// https://stackoverflow.com/a/46205940
func (p *AppBarDraggable) onPanStart(arguments interface{}) (reply interface{}, err error) {
	argumentsMap := arguments.(map[interface{}]interface{})
	p.cursorPosX = int(argumentsMap["dx"].(float64))
	p.cursorPosY = int(argumentsMap["dy"].(float64))
	return nil, nil
}

// onPanUpdate calls GLFW functions that aren't thread safe.
// to run function on the main go-flutter thread, use HandleFuncSync instead of HandleFunc!
func (p *AppBarDraggable) onPanUpdate(arguments interface{}) (reply interface{}, err error) {
	xpos, ypos := p.window.GetCursorPos() // This function must only be called from the main thread.
	deltaX := int(xpos) - p.cursorPosX
	deltaY := int(ypos) - p.cursorPosY

	x, y := p.window.GetPos()           // This function must only be called from the main thread.
	p.window.SetPos(x+deltaX, y+deltaY) // This function must only be called from the main thread.

	return nil, nil
}

func (p *AppBarDraggable) onClose(arguments interface{}) (reply interface{}, err error) {
	// This function may be called from any thread. Access is not synchronized.
	p.window.SetShouldClose(true)
	return nil, nil
}


================================================
FILE: draggable_borderless/go/go.mod
================================================
module draggable_borderless/go

go 1.19

require (
	github.com/go-flutter-desktop/go-flutter v0.52.2
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164
	github.com/pkg/errors v0.9.1
)

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: draggable_borderless/go/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164 h1:ddtotcEXIT7dFhSeXIWjK8YMFYl5bB2NdYQwgv6Uqjk=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20260406072232-3ac4aa2bb164/go.mod h1:SyRD8YfuKk+ZXlDqYiqe1qMSqjNgtHzBTG810KUagMc=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: draggable_borderless/go/hover.yaml
================================================
#application-name: "draggable_borderless" # Uncomment to modify this value.
#executable-name: "draggable_borderless" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces
#package-name: "draggableborderless" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces
license: "" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses
target: lib/main_desktop.dart
# opengl: "none" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)
docker: false
engine-version: "" # change to a engine version commit


================================================
FILE: draggable_borderless/lib/main_desktop.dart
================================================
import 'package:flutter/foundation.dart'
    show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/services.dart';

void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Code Sample for widgets.Listener',
      theme: ThemeData(
        // If the host is missing some fonts, it can cause the
        // text to not be rendered or worse the app might crash.
        fontFamily: 'Roboto',
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: DraggebleAppBar(title: "Draggable borderless"),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Select the AppBar to drag the window',
                style: TextStyle(fontSize: 18),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class DraggebleAppBar extends StatelessWidget implements PreferredSizeWidget {
  static const platform_channel_draggable =
      MethodChannel('samples.go-flutter.dev/draggable');

  AppBar appBar;

  DraggebleAppBar({@required String title}) {
    this.appBar = AppBar(
      title: Text(title),
      actions: <Widget>[
        new IconButton(
          icon: new Icon(Icons.close),
          onPressed: () async =>
              await platform_channel_draggable.invokeMethod("onClose"),
        ),
      ],
      leading: new Container(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        child: appBar, onPanStart: onPanStart, onPanUpdate: onPanUpdate);
  }

  @override
  Size get preferredSize => new Size.fromHeight(kToolbarHeight);

  void onPanUpdate(DragUpdateDetails details) async {
    await platform_channel_draggable.invokeMethod('onPanUpdate');
  }

  void onPanStart(DragStartDetails details) async {
    await platform_channel_draggable.invokeMethod('onPanStart',
        {"dx": details.globalPosition.dx, "dy": details.globalPosition.dy});
  }
}


================================================
FILE: draggable_borderless/pubspec.yaml
================================================
name: draggable_borderless
description: A new Flutter project.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.2.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons:

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  # assets:
  #  - images/a_dot_burr.jpeg
  #  - images/a_dot_ham.jpeg

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages


================================================
FILE: keyboard_event/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: keyboard_event/README.md
================================================
# keyboard_event

A [`RawKeyEvent`](https://api.flutter.dev/flutter/services/RawKeyEvent-class.html) go-flutter-desktop example.


## Demo
<p align="center">
  <img src="./keyboard_event.gif" width="650" align="center" alt="Demo of the
  example">
</p>




================================================
FILE: keyboard_event/fonts/Roboto/LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: keyboard_event/go/.gitignore
================================================
build
.last_goflutter_check
.last_go-flutter_check


================================================
FILE: keyboard_event/go/cmd/main.go
================================================
package main

import (
	"fmt"
	"image"
	_ "image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/go-flutter-desktop/go-flutter"
	"github.com/pkg/errors"
)

// vmArguments may be set by hover at compile-time
var vmArguments string

func main() {
	// DO NOT EDIT, add options in options.go
	mainOptions := []flutter.Option{
		flutter.OptionVMArguments(strings.Split(vmArguments, ";")),
		flutter.WindowIcon(iconProvider),
	}
	err := flutter.Run(append(options, mainOptions...)...)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func iconProvider() ([]image.Image, error) {
	execPath, err := os.Executable()
	if err != nil {
		return nil, errors.Wrap(err, "failed to resolve executable path")
	}
	execPath, err = filepath.EvalSymlinks(execPath)
	if err != nil {
		return nil, errors.Wrap(err, "failed to eval symlinks for executable path")
	}
	imgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), "assets", "icon.png"))
	if err != nil {
		return nil, errors.Wrap(err, "failed to open assets/icon.png")
	}
	img, _, err := image.Decode(imgFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode image")
	}
	return []image.Image{img}, nil
}


================================================
FILE: keyboard_event/go/cmd/options.go
================================================
package main

import (
	"github.com/go-flutter-desktop/go-flutter"
)

var options = []flutter.Option{
	flutter.WindowInitialDimensions(800, 1280),
}


================================================
FILE: keyboard_event/go/go.mod
================================================
module keyboard_event/go

go 1.19

require (
	github.com/go-flutter-desktop/go-flutter v0.52.2
	github.com/pkg/errors v0.9.1
)

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: keyboard_event/go/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: keyboard_event/go/hover.yaml
================================================
#application-name: "keyboard_event" # Uncomment to modify this value.
#executable-name: "keyboard_event" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces
#package-name: "keyboardevent" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces
license: "" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses
target: lib/main_desktop.dart
# opengl: "none" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)
docker: false
engine-version: "" # change to a engine version commit


================================================
FILE: keyboard_event/lib/app.dart
================================================
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Code Sample for Keyboard event',
      theme: ThemeData(
        // If the host is missing some fonts, it can cause the
        // text to not be rendered or worse the app might crash.
        fontFamily: 'Roboto',
        primarySwatch: Colors.blue,
      ),
      home: KeyboardTestPage(),
    );
  }
}

/// Keyboard test page for the example application.
class KeyboardTestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _KeyboardTestPageState();
  }
}

class _KeyboardTestPageState extends State<KeyboardTestPage> {
  final List<String> _messages = [];

  final FocusNode _focusNode = FocusNode();
  final ScrollController _scrollController = new ScrollController();

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    FocusScope.of(context).requestFocus(_focusNode);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: new Text('Keyboard events test'),
      ),
      body: new RawKeyboardListener(
        focusNode: _focusNode,
        onKey: onKeyEvent,
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 16.0),
          child: SingleChildScrollView(
              controller: _scrollController,
              child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: _messages.map((m) => new Text(m)).toList())),
        ),
      ),
    );
  }

  void onKeyEvent(RawKeyEvent event) {
    bool isKeyDown;
    switch (event.runtimeType) {
      case RawKeyDownEvent:
        isKeyDown = true;
        break;
      case RawKeyUpEvent:
        isKeyDown = false;
        break;
      default:
        throw new Exception('Unexpected runtimeType of RawKeyEvent');
    }

    _addMessage(
        '${event.data.runtimeType} - ${isKeyDown ? 'KeyDown' : 'KeyUp'}:\n- Modifiers: ${event.data.modifiersPressed}\n- KeyLabel: ${event.data.keyLabel}\n- physicalKey: ${event.data.physicalKey}\n- logicalkey: ${event.data.logicalKey}\n- character: ${event.character}');
  }

  void _addMessage(String message) {
    setState(() {
      _messages.add(message);
    });
    SchedulerBinding.instance.addPostFrameCallback((_) {
      _scrollController.jumpTo(
        _scrollController.position.maxScrollExtent,
      );
    });
  }
}


================================================
FILE: keyboard_event/lib/main.dart
================================================
import 'package:flutter/material.dart';

import 'package:keyboard_event/app.dart';

void main() {
  runApp(MyApp());
}


================================================
FILE: keyboard_event/lib/main_desktop.dart
================================================
import 'package:flutter/foundation.dart'
    show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart';

import 'package:keyboard_event/app.dart';

void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  runApp(MyApp());
}


================================================
FILE: keyboard_event/pubspec.yaml
================================================
name: keyboard_event
description: A new Flutter project.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons:

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto/Roboto-Thin.ttf
          weight: 100
        - asset: fonts/Roboto/Roboto-Light.ttf
          weight: 300
        - asset: fonts/Roboto/Roboto-Regular.ttf
          weight: 400
        - asset: fonts/Roboto/Roboto-Medium.ttf
          weight: 500
        - asset: fonts/Roboto/Roboto-Bold.ttf
          weight: 700
        - asset: fonts/Roboto/Roboto-Black.ttf
          weight: 900


================================================
FILE: plugin_tutorial/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: plugin_tutorial/README.md
================================================
# plugin_tutorial

A detailed tutorial for developing plugins is available at: [go-flutter wiki](https://github.com/go-flutter-desktop/go-flutter/wiki/Implement-a-plugin).

The plugins source code is stored in the same example: [./go-plugin-example](./go-plugin-example)


================================================
FILE: plugin_tutorial/go/.gitignore
================================================
build
.last_goflutter_check
.last_go-flutter_check


================================================
FILE: plugin_tutorial/go/cmd/main.go
================================================
package main

import (
	"fmt"
	"image"
	_ "image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/go-flutter-desktop/go-flutter"
	"github.com/pkg/errors"
)

// vmArguments may be set by hover at compile-time
var vmArguments string

func main() {
	// DO NOT EDIT, add options in options.go
	mainOptions := []flutter.Option{
		flutter.OptionVMArguments(strings.Split(vmArguments, ";")),
		flutter.WindowIcon(iconProvider),
	}
	err := flutter.Run(append(options, mainOptions...)...)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func iconProvider() ([]image.Image, error) {
	execPath, err := os.Executable()
	if err != nil {
		return nil, errors.Wrap(err, "failed to resolve executable path")
	}
	execPath, err = filepath.EvalSymlinks(execPath)
	if err != nil {
		return nil, errors.Wrap(err, "failed to eval symlinks for executable path")
	}
	imgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), "assets", "icon.png"))
	if err != nil {
		return nil, errors.Wrap(err, "failed to open assets/icon.png")
	}
	img, _, err := image.Decode(imgFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode image")
	}
	return []image.Image{img}, nil
}


================================================
FILE: plugin_tutorial/go/cmd/options.go
================================================
package main

import (
	"github.com/go-flutter-desktop/go-flutter"
	"github.com/go-flutter-desktop/plugins/go-plugin-example/battery"
	"github.com/go-flutter-desktop/plugins/go-plugin-example/complex"
)

var options = []flutter.Option{
	flutter.WindowInitialDimensions(100, 100),
	flutter.PopBehavior(flutter.PopBehaviorClose), // on SystemNavigator.pop() closes the app
	flutter.AddPlugin(&battery.MyBatteryPlugin{}), // our wiki plugin
	flutter.AddPlugin(&complex.Example{}),         // another example
}


================================================
FILE: plugin_tutorial/go/go.mod
================================================
module plugin_tutorial/go

go 1.19

require (
	github.com/go-flutter-desktop/go-flutter v0.52.2
	github.com/go-flutter-desktop/plugins/go-plugin-example/battery 01528a4714a5
	github.com/go-flutter-desktop/plugins/go-plugin-example/complex 01528a4714a5
	github.com/pkg/errors v0.9.1
)

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect
	golang.org/x/text v0.3.7 // indirect
)

replace github.com/go-flutter-desktop/plugins/go-plugin-example/battery => ../go-plugin-example/battery

replace github.com/go-flutter-desktop/plugins/go-plugin-example/complex => ../go-plugin-example/complex


================================================
FILE: plugin_tutorial/go/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: plugin_tutorial/go/hover.yaml
================================================
#application-name: "plugin_tutorial" # Uncomment to modify this value.
#executable-name: "plugin_tutorial" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces
#package-name: "plugintutorial" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces
license: "" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses
target: lib/main_desktop.dart
# opengl: "none" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)
docker: false
engine-version: "" # change to a engine version commit


================================================
FILE: plugin_tutorial/go-plugin-example/battery/go.mod
================================================
module github.com/go-flutter-desktop/plugins/go-plugin-example/battery

go 1.19

require github.com/go-flutter-desktop/go-flutter v0.52.2

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	github.com/pkg/errors v0.9.1 // indirect
	golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: plugin_tutorial/go-plugin-example/battery/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: plugin_tutorial/go-plugin-example/battery/main.go
================================================
package battery

import (
	flutter "github.com/go-flutter-desktop/go-flutter"
	"github.com/go-flutter-desktop/go-flutter/plugin"
)

//  Make sure to use the same channel name as was used on the Flutter client side.
const channelName = "samples.flutter.dev/battery"

// MyBatteryPlugin demonstrates how to call a platform-specific API to retrieve
// the current battery level.
//
// This example matches the guide example available on:
// https://flutter.dev/docs/development/platform-integration/platform-channels
type MyBatteryPlugin struct{}

var _ flutter.Plugin = &MyBatteryPlugin{} // compile-time type check

// InitPlugin creates a MethodChannel and set a HandleFunc to the
// shared 'getBatteryLevel' method.
// https://godoc.org/github.com/go-flutter-desktop/go-flutter/plugin#MethodChannel
//
// The plugin is using a MethodChannel through the StandardMethodCodec.
//
// You can also use the more basic BasicMessageChannel, which supports basic,
// asynchronous message passing using a custom message codec.
// You can also use the specialized BinaryCodec, StringCodec, and JSONMessageCodec
// struct, or create your own codec.
//
// The JSONMessageCodec was deliberately left out because in Go its better to
// decode directly to known structs.
func (p *MyBatteryPlugin) InitPlugin(messenger plugin.BinaryMessenger) error {
	channel := plugin.NewMethodChannel(messenger, channelName, plugin.StandardMethodCodec{})
	channel.HandleFunc("getBatteryLevel", handleGetBatteryLevel)
	return nil // no error
}

// handleGetBatteryLevel is called when the method getBatteryLevel is invoked by
// the dart code.
// The function returns a fake battery level, without raising an error.
//
// Supported return types of StandardMethodCodec codec are described in a table:
// https://godoc.org/github.com/go-flutter-desktop/go-flutter/plugin#StandardMessageCodec
func handleGetBatteryLevel(arguments interface{}) (reply interface{}, err error) {
	batteryLevel := int32(55) // Your platform-specific API
	return batteryLevel, nil
}


================================================
FILE: plugin_tutorial/go-plugin-example/complex/go.mod
================================================
module github.com/go-flutter-desktop/plugins/go-plugin-example/complex

go 1.19

require github.com/go-flutter-desktop/go-flutter v0.52.2

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	github.com/pkg/errors v0.9.1 // indirect
	golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: plugin_tutorial/go-plugin-example/complex/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70 h1:SeSEfdIxyvwGJliREIJhRPPXvW6sDlLT+UQ3B0hD0NA=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: plugin_tutorial/go-plugin-example/complex/main.go
================================================
package complex

import (
	"errors"
	"log"
	"os"
	"time"

	flutter "github.com/go-flutter-desktop/go-flutter"
	"github.com/go-flutter-desktop/go-flutter/plugin"
)

// Example demonstrates how to call a platform-specific API to retrieve
// a complex data structure
type Example struct {
	channel *plugin.MethodChannel
}

var _ flutter.Plugin = &Example{}

// InitPlugin creates a MethodChannel and set a HandleFunc to the
// shared 'getData' method.
func (p *Example) InitPlugin(messenger plugin.BinaryMessenger) error {
	p.channel = plugin.NewMethodChannel(messenger, "instance.id/go/data", plugin.StandardMethodCodec{})
	p.channel.HandleFunc("getData", getRemotesFunc)
	p.channel.HandleFunc("mutualCall", p.mutualCall)
	p.channel.HandleFunc("getError", getErrorFunc)
	p.channel.CatchAllHandleFunc(catchAllTest)

	return nil
}

// mutualCall is attached to the plugin struct
func (p *Example) mutualCall(arguments interface{}) (reply interface{}, err error) {
	go func() {
		time.Sleep(3 * time.Second)
		if rep, err := p.channel.InvokeMethodWithReply("InvokeMethodWithReply", "text_from_golang"); err != nil {
			log.Println("InvokeMethod error:", err)
		} else {
			if rep.(string) != "text_from_dart" {
				log.Println("InvokeMethod error: rep.(string) != \"text_from_dart\"")
				os.Exit(1)
			}
		}
	}()

	if arguments.(string) != "hello_from_dart" {
		log.Println("InvokeMethod error: arguments.(string) !=  \"hello_from_dart\"")
		os.Exit(1)
	}

	return "hello_from_go", nil
}

func catchAllTest(methodCall interface{}) (reply interface{}, err error) {
	method := methodCall.(plugin.MethodCall)
	// return the randomized Method Name
	return method.Method, nil
}

func getRemotesFunc(arguments interface{}) (reply interface{}, err error) {
	dartMsg := arguments.(string) // reading the string argument
	if dartMsg != "HelloFromDart" {
		return nil, errors.New("wrong message value, expecting 'HelloFromDart' got '" + dartMsg + "'")
	}

	var sectionList = make([]interface{}, 4)
	sectionList[0] = map[interface{}]interface{}{
		"instanceid": int32(1023),
		"pcbackup":   "test",
		"brbackup":   "test2",
	}
	sectionList[1] = map[interface{}]interface{}{
		"instanceid": int32(1024),
		"pcbackup":   "test",
		"brbackup":   "test2",
	}

	sectionList[2] = map[interface{}]interface{}{
		"instanceid": int32(1056),
		"pcbackup":   "coucou",
		"brbackup":   "coucou2",
	}

	sectionList[3] = map[interface{}]interface{}{
		"instanceid": int32(3322),
		"pcbackup":   "finaly",
		"brbackup":   "finaly2",
	}

	return sectionList, nil
}

func getErrorFunc(arguments interface{}) (reply interface{}, err error) {
	return nil, plugin.NewError("customErrorCode", errors.New("Some error"))
}


================================================
FILE: plugin_tutorial/lib/main_desktop.dart
================================================
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'dart:math';
import 'dart:async' as async;

// The client and host sides of a channel are connected through
// a channel name passed in the channel constructor.
const platform_channel_battery =
    const MethodChannel('samples.flutter.dev/battery');

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // Example from the WIKI
  //
  test('Test Battery Plugin result', () async {
    // Invoke a method on the method channel, specifying the concrete
    // method to call via the String identifier.
    final int result =
        await platform_channel_battery.invokeMethod('getBatteryLevel');
    expect(result, 55);

    final String batteryLevel = '          -- Battery level at $result % .';
    print(batteryLevel);
  });

  group('Complex plugin', () {
    const platform_complex_structure =
        const MethodChannel('instance.id/go/data');

    // A more complicated plugin
    test('Test StandardMethodCodec array of map', () async {
      final List<dynamic> result =
          await platform_complex_structure.invokeMethod('getData',
              "HelloFromDart"); // passing "HelloFromDart" as an argument
      expect(result, [
        {"instanceid": 1023, "pcbackup": "test", "brbackup": "test2"},
        {"instanceid": 1024, "pcbackup": "test", "brbackup": "test2"},
        {"instanceid": 1056, "pcbackup": "coucou", "brbackup": "coucou2"},
        {"instanceid": 3322, "pcbackup": "finaly", "brbackup": "finaly2"}
      ]);
    });

    test('Test golang InvokeMethodWithReply', () async {
      var method;
      var arguments;
      async.Completer completer = new async.Completer();

      platform_complex_structure.setMethodCallHandler((MethodCall call) async {
        method = call.method;
        arguments = call.arguments;
        completer.complete();
        return "text_from_dart";
      });

      // Triggers the above setMethodCallHandler handler
      var result = await platform_complex_structure.invokeMethod(
          'mutualCall', 'hello_from_dart');
      expect(result, "hello_from_go");

      await completer.future;

      expect(method, "InvokeMethodWithReply");
      expect(arguments, "text_from_golang");
    });

    test('Custom errors', () async {
      var matcher = predicate(
          (e) => e is PlatformException && e.code == "customErrorCode");
      expect(
        platform_complex_structure.invokeMethod('getError'),
        throwsA(matcher),
      );
    });

    test('Test golang CatchAllHandleFunc', () async {
      // golang can return the random methodName
      final String methodName =
          'test/' + new Random().nextInt(100000).toString();
      final String resultPathPrefix =
          await platform_complex_structure.invokeMethod(methodName);
      expect(resultPathPrefix, methodName);
    });
  });

  tearDownAll(() async {
    SystemNavigator.pop(); // close the app
  });
}


================================================
FILE: plugin_tutorial/pubspec.yaml
================================================
name: plugin_tutorial
description: A new Flutter project.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.2.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons:

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true


================================================
FILE: pointer_demo/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: pointer_demo/README.md
================================================
# pointer_demo

A new go-flutter-desktop example.


## Demo
<p align="center">
  <img src="./hover.gif" width="650" align="center" alt="Demo of the
  example">
</p>




================================================
FILE: pointer_demo/fonts/Roboto/LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: pointer_demo/go/.gitignore
================================================
build
.last_goflutter_check
.last_go-flutter_check


================================================
FILE: pointer_demo/go/cmd/main.go
================================================
package main

import (
	"fmt"
	"image"
	_ "image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/go-flutter-desktop/go-flutter"
	"github.com/pkg/errors"
)

// vmArguments may be set by hover at compile-time
var vmArguments string

func main() {
	// DO NOT EDIT, add options in options.go
	mainOptions := []flutter.Option{
		flutter.OptionVMArguments(strings.Split(vmArguments, ";")),
		flutter.WindowIcon(iconProvider),
	}
	err := flutter.Run(append(options, mainOptions...)...)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func iconProvider() ([]image.Image, error) {
	execPath, err := os.Executable()
	if err != nil {
		return nil, errors.Wrap(err, "failed to resolve executable path")
	}
	execPath, err = filepath.EvalSymlinks(execPath)
	if err != nil {
		return nil, errors.Wrap(err, "failed to eval symlinks for executable path")
	}
	imgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), "assets", "icon.png"))
	if err != nil {
		return nil, errors.Wrap(err, "failed to open assets/icon.png")
	}
	img, _, err := image.Decode(imgFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode image")
	}
	return []image.Image{img}, nil
}


================================================
FILE: pointer_demo/go/cmd/options.go
================================================
package main

import (
	"github.com/go-flutter-desktop/go-flutter"
)

var options = []flutter.Option{
	flutter.WindowInitialDimensions(800, 1280),
}


================================================
FILE: pointer_demo/go/go.mod
================================================
module pointer_demo/go

go 1.19

require (
	github.com/go-flutter-desktop/go-flutter v0.52.2
	github.com/pkg/errors v0.9.1
)

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: pointer_demo/go/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: pointer_demo/go/hover.yaml
================================================
#application-name: "pointer_demo" # Uncomment to modify this value.
#executable-name: "pointer_demo" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces
#package-name: "pointerdemo" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces
license: "" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses
target: lib/main_desktop.dart
# opengl: "none" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)
docker: false
engine-version: "" # change to a engine version commit


================================================
FILE: pointer_demo/lib/app.dart
================================================
// This example makes a [Container] react to being entered by a mouse
// pointer, showing a count of the number of entries and exits.

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Code Sample for widgets.Listener',
      theme: ThemeData(
        // If the host is missing some fonts, it can cause the
        // text to not be rendered or worse the app might crash.
        fontFamily: 'Roboto',
        primarySwatch: Colors.blue,
      ),
      home: MyStatefulWidget(),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({Key key}) : super(key: key);

  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _enterCounter = 0;
  int _exitCounter = 0;
  double x = 0.0;
  double y = 0.0;
  String _mouseStatus = "hovering";

  void _incrementCounter(PointerEnterEvent details) {
    setState(() {
      _enterCounter++;
    });
  }

  void _decrementCounter(PointerExitEvent details) {
    setState(() {
      _exitCounter++;
    });
  }

  void _updateLocation(PointerHoverEvent details) {
    setState(() {
      x = details.position.dx;
      y = details.position.dy;
      _mouseStatus = "hovering, button ${details.buttons.toString()}";
    });
  }

  void _updateMove(PointerMoveEvent details) {
    setState(() {
      x = details.position.dx;
      y = details.position.dy;
      _mouseStatus = "dragging, button ${details.buttons.toString()}";
    });
  }

  void _pointerDown(PointerDownEvent details) {
    setState(() {
      x = details.position.dx;
      y = details.position.dy;
      _mouseStatus = "down, button ${details.buttons.toString()}";
    });
  }

  void _pointerUp(PointerUpEvent details) {
    setState(() {
      x = details.position.dx;
      y = details.position.dy;
      _mouseStatus = "up, button ${details.buttons.toString()}";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hover Example'),
      ),
      body: Center(
        child: ConstrainedBox(
          constraints: BoxConstraints.tight(Size(300.0, 200.0)),
          child: MouseRegion(
            onEnter: _incrementCounter,
            onExit: _decrementCounter,
            child: Listener(
              onPointerDown: _pointerDown,
              onPointerUp: _pointerUp,
              onPointerMove: _updateMove,
              onPointerHover: _updateLocation,
              child: Container(
                color: Colors.lightBlueAccent,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('You have pointed at this box this many times:'),
                    Text(
                      '$_enterCounter Entries\n$_exitCounter Exits',
                    ),
                    Text(
                      'The cursor is here: (${x.toStringAsFixed(2)}, ${y.toStringAsFixed(2)})',
                    ),
                    Divider(),
                    Text(
                      'The mouse is ${_mouseStatus}',
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}


================================================
FILE: pointer_demo/lib/main.dart
================================================
import 'package:flutter/material.dart';

import 'package:pointer_demo/app.dart';

void main() {
  runApp(MyApp());
}


================================================
FILE: pointer_demo/lib/main_desktop.dart
================================================
import 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart';

import 'package:pointer_demo/app.dart';

void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  runApp(MyApp());
}


================================================
FILE: pointer_demo/pubspec.yaml
================================================
name: pointer_demo
description: A new Flutter project.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons:

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto/Roboto-Thin.ttf
          weight: 100
        - asset: fonts/Roboto/Roboto-Light.ttf
          weight: 300
        - asset: fonts/Roboto/Roboto-Regular.ttf
          weight: 400
        - asset: fonts/Roboto/Roboto-Medium.ttf
          weight: 500
        - asset: fonts/Roboto/Roboto-Bold.ttf
          weight: 700
        - asset: fonts/Roboto/Roboto-Black.ttf
          weight: 900


================================================
FILE: renovate.json
================================================
{
  "extends": ["config:base"],
  "automerge": true,
  "major": {
    "automerge": false
  },
  "gomodTidy": true,
  "requiredStatusChecks": null,
  "postUpdateOptions": [
    "gomodTidy"
  ],
  "ignoreDeps": [
    "golang.org/x/crypto",
    "golang.org/x/net",
    "golang.org/x/sys",
    "intl"
  ],
  "ignorePaths": [
    "*/android/**"
  ]
}


================================================
FILE: stocks/.gitignore
================================================
.DS_Store
.dart_tool/

.packages
.pub/

build/


================================================
FILE: stocks/README.md
================================================
# Stocks

[Example from the flutter repo](https://github.com/flutter/flutter/tree/master/examples/stocks)  
Demo app for the material design widgets and other features provided by Flutter.

# Difference

The only edit made was to change the font to Roboto.  
_If the host is missing some fonts, it can cause the text to not be rendered or
worse the app might crash_

```diff
diff --git a/examples/stocks/lib/main.dart b/examples/stocks/lib/main.dart
index d415902d7..eba3362d9 100644
--- a/examples/stocks/lib/main.dart
+++ b/examples/stocks/lib/main.dart
@@ -71,12 +71,14 @@ class StocksAppState extends State<StocksApp> {
       case StockMode.optimistic:
         return new ThemeData(
           brightness: Brightness.light,
-          primarySwatch: Colors.purple
+          primarySwatch: Colors.purple,
+          fontFamily: 'Roboto'
         );
       case StockMode.pessimistic:
         return new ThemeData(
           brightness: Brightness.dark,
-          accentColor: Colors.redAccent
+          accentColor: Colors.redAccent,
+          fontFamily: 'Roboto'
         );
     }
     assert(_configuration.stockMode != null);
diff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml
index 162a7914e..6dba3fbca 100644
--- a/examples/stocks/pubspec.yaml
+++ b/examples/stocks/pubspec.yaml
@@ -74,4 +74,18 @@ dev_dependencies:
 flutter:
   uses-material-design: true
 
-# PUBSPEC CHECKSUM: cf1e
+  fonts:
+    - family: Roboto
+      fonts:
+        - asset: fonts/Roboto/Roboto-Thin.ttf
+          weight: 100
+        - asset: fonts/Roboto/Roboto-Light.ttf
+          weight: 300
+        - asset: fonts/Roboto/Roboto-Regular.ttf
+          weight: 400
+        - asset: fonts/Roboto/Roboto-Medium.ttf
+          weight: 500
+        - asset: fonts/Roboto/Roboto-Bold.ttf
+          weight: 700
+        - asset: fonts/Roboto/Roboto-Black.ttf
+          weight: 900
```



================================================
FILE: stocks/fonts/Roboto/LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: stocks/go/.gitignore
================================================
build
.last_goflutter_check
.last_go-flutter_check


================================================
FILE: stocks/go/cmd/main.go
================================================
package main

import (
	"fmt"
	"image"
	_ "image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/go-flutter-desktop/go-flutter"
	"github.com/pkg/errors"
)

// vmArguments may be set by hover at compile-time
var vmArguments string

func main() {
	// DO NOT EDIT, add options in options.go
	mainOptions := []flutter.Option{
		flutter.OptionVMArguments(strings.Split(vmArguments, ";")),
		flutter.WindowIcon(iconProvider),
	}
	err := flutter.Run(append(options, mainOptions...)...)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func iconProvider() ([]image.Image, error) {
	execPath, err := os.Executable()
	if err != nil {
		return nil, errors.Wrap(err, "failed to resolve executable path")
	}
	execPath, err = filepath.EvalSymlinks(execPath)
	if err != nil {
		return nil, errors.Wrap(err, "failed to eval symlinks for executable path")
	}
	imgFile, err := os.Open(filepath.Join(filepath.Dir(execPath), "assets", "icon.png"))
	if err != nil {
		return nil, errors.Wrap(err, "failed to open assets/icon.png")
	}
	img, _, err := image.Decode(imgFile)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode image")
	}
	return []image.Image{img}, nil
}


================================================
FILE: stocks/go/cmd/options.go
================================================
package main

import (
	"github.com/go-flutter-desktop/go-flutter"
)

var options = []flutter.Option{
	flutter.WindowInitialDimensions(800, 1280),
}


================================================
FILE: stocks/go/go.mod
================================================
module stocks/go

go 1.19

require (
	github.com/go-flutter-desktop/go-flutter v0.52.2
	github.com/pkg/errors v0.9.1
)

require (
	github.com/Xuanwo/go-locale v1.1.0 // indirect
	github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
	github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f // indirect
	golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b // indirect
	golang.org/x/text v0.3.7 // indirect
)


================================================
FILE: stocks/go/go.sum
================================================
github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=
github.com/Xuanwo/go-locale v1.1.0/go.mod h1:UKrHoZB3FPIk9wIG2/tVSobnHgNnceGSH3Y8DY5cASs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-flutter-desktop/go-flutter v0.52.2 h1:08LdijXBSiqUcSzofrytBPpItF+zBgJ7s0sDixFhbAU=
github.com/go-flutter-desktop/go-flutter v0.52.2/go.mod h1:8lIXoHEAZl01qK7pKwUwf/dzF2mD0JRoaxkGoYu32k8=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 h1:zDw5v7qm4yH7N8C8uWd+8Ii9rROdgWxQuGoJ9WDXxfk=
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f h1:w3h343WgVLKLITcSpwecCDcq0FO8pAv6A/UG86hhFtY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220712193148-63cf1f4ef61f/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY=
github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20211023085530-d6a326fbbf70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8=
golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=


================================================
FILE: stocks/go/hover.yaml
================================================
#application-name: "stocks" # Uncomment to modify this value.
#executable-name: "stocks" # Uncomment to modify this value. Only lowercase a-z, numbers, underscores and no spaces
#package-name: "stocks" # Uncomment to modify this value. Only lowercase a-z, numbers and no underscores or spaces
license: "" # MANDATORY: Fill in your SPDX license name: https://spdx.org/licenses
target: lib/main_desktop.dart
# opengl: "none" # Uncomment this line if you have trouble with your OpenGL driver (https://github.com/go-flutter-desktop/go-flutter/issues/272)
docker: false
engine-version: "" # change to a engine version commit


================================================
FILE: stocks/go/packaging/darwin-bundle/{{.applicationName}} {{.version}}.app/Contents/Info.plist.tmpl
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
        <string>{{.executableName}}</string>
        <key>CFBundleGetInfoString</key>
        <string>{{.description}}</string>
        <key>CFBundleIconFile</key>
        <string>icon.icns</string>
        <key>NSHighResolutionCapable</key>
        <true/>
        <key>CFBundleIdentifier</key>
        <string>{{.organizationName}}.{{.packageName}}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleLongVersionString</key>
        <string>{{.version}}</string>
        <key>CFBundleName</key>
        <string>{{.applicationName}}</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>{{.version}}</string>
        <key>CFBundleSignature</key>
        <string>{{.organizationName}}.{{.packageName}}</string>
        <key>CFBundleVersion</key>
        <string>{{.version}}</string>
        <key>CSResourcesFileMapped</key>
        <true/>
        <key>NSHumanReadableCopyright</key>
        <string></string>
        <key>NSPrincipalClass</key>
        <string>NSApplication</string>
    </dict>
</plist>


================================================
FILE: stocks/go/packaging/darwin-pkg/flat/Distribution.tmpl
================================================
<?xml version="1.0" encoding="utf-8"?>
<installer-gui-script minSpecVersion="1">
	<title>{{.applicationName}}</title>
	<background alignment="topleft" file="root/Applications/{{.applicationName}}.app/Contents/MacOS/assets/icon.png"/>
	<choices-outline>
	    <line choice="choiceBase"/>
    </choices-outline>
    <choice id="choiceBase" title="base">
        <pkg-ref id="{{.organizationName}}.base.pkg"/>
    </choice>
    <pkg-ref id="{{.organizationName}}.base.pkg" version="{{.version}}" auth="Root">#base.pkg</pkg-ref>
</installer-gui-script>


================================================
FILE: stocks/go/packaging/darwin-pkg/flat/base.pkg/PackageInfo.tmpl
================================================
<pkg-info format-version="2" identifier="{{.organizationName}}.base.pkg" version="{{.version}}" install-location="/" auth="root">
	<bundle-version>
		<bundle id="{{.organizationName}}" CFBundleIdentifier="{{.organizationName}}.{{.packageName}}" path="./Applications/{{.applicationName}}.app" CFBundleVersion="{{.version}}"/>
    </bundle-version>
</pkg-info>


================================================
FILE: stocks/go/packaging/linux-appimage/AppRun.tmpl
================================================
#!/bin/sh
cd "$(dirname "$0")"
exec ./build/{{.executableName}}


================================================
FILE: stocks/go/packaging/linux-appimage/{{.packageName}}.desktop.tmpl
================================================
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Categories=
Comment={{.description}}
Name={{.applicationName}}
Icon={{.iconPath}}
Exec={{.executablePath}}


================================================
FILE: stocks/go/packaging/linux-deb/DEBIAN/control.tmpl
================================================
Package: {{.packageName}}
Architecture: amd64
Maintainer: @{{.author}}
Priority: optional
Version: {{.version}}
Description: {{.description}}


================================================
FILE: stocks/go/packaging/linux-deb/usr/bin/{{.executableName}}.tmpl
================================================
#!/bin/sh
/usr/lib/{{.packageName}}/{{.executableName}}


================================================
FILE: stocks/go/packaging/linux-deb/usr/share/applications/{{.executableName}}.desktop.tmpl
================================================
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Categories=
Comment={{.description}}
Name={{.applicationName}}
Icon={{.iconPath}}
Exec={{.executablePath}}


================================================
FILE: stocks/go/packaging/linux-pkg/PKGBUILD.tmpl
================================================
pkgname={{.packageName}}
pkgver={{.version}}
pkgrel={{.release}}
pkgdesc="{{.description}}"
arch=("x86_64")
license=('{{.license}}')

package() {
    mkdir -p $pkgdir/
    cp * $pkgdir/ -r
}


================================================
FILE: stocks/go/packaging/linux-pkg/src/usr/bin/{{.executableName}}.tmpl
================================================
#!/bin/sh
/usr/lib/{{.packageName}}/{{.executableName}}


================================================
FILE: stocks/go/packaging/linux-pkg/src/usr/share/applications/{{.executableName}}.desktop.tmpl
================================================
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Categories=
Comment={{.description}}
Name={{.applicationName}}
Icon={{.iconPath}}
Exec={{.executablePath}}


================================================
FILE: stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/bin/{{.executableName}}.tmpl
================================================
#!/bin/sh
/usr/lib/{{.packageName}}/{{.executableName}}


================================================
FILE: stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/share/applications/{{.executableName}}.desktop.tmpl
================================================
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Categories=
Comment={{.description}}
Name={{.applicationName}}
Icon={{.iconPath}}
Exec={{.executablePath}}


================================================
FILE: stocks/go/packaging/linux-rpm/SPECS/{{.packageName}}.spec.tmpl
================================================
Name: {{.packageName}}
Version: {{.version}}
Release: {{.release}}
Summary: {{.description}}
License: {{.license}}

%description
{{.description}}

%install
mkdir -p $RPM_BUILD_ROOT%{_bindir}
mkdir -p $RPM_BUILD_ROOT/usr/lib/{{.packageName}}
mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications
cp -R $RPM_BUILD_DIR/{{.packageName}}-{{.version}}-{{.release}}.x86_64/* $RPM_BUILD_ROOT
chmod 0755 $RPM_BUILD_ROOT%{_bindir}/{{.executableName}}
chmod 0755 $RPM_BUILD_ROOT%{_datadir}/applications/{{.executableName}}.desktop

%files
%{_bindir}/{{.executableName}}
/usr/lib/{{.packageName}}/
%{_datadir}/applications/{{.executableName}}.desktop


================================================
FILE: stocks/go/packaging/linux-snap/snap/local/{{.executableName}}.desktop.tmpl
================================================
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Categories=
Comment={{.description}}
Name={{.applicationName}}
Icon={{.iconPath}}
Exec={{.executablePath}}


================================================
FILE: stocks/go/packaging/linux-snap/snap/snapcraft.yaml.tmpl
================================================
name: {{.packageName}}
base: core18
version: '{{.version}}'
summary: {{.description}}
description: |
  {{.description}}
confinement: devmode
grade: devel
apps:
  {{.packageName}}:
    command: {{.executableName}}
    desktop: local/{{.executableName}}.desktop
parts:
  desktop:
    plugin: dump
    source: snap
  assets:
    plugin: dump
    source: build/assets
  app:
    plugin: dump
    source: build
    stage-packages:
      - libx11-6
      - libxrandr2
      - libxcursor1
      - libxinerama1


================================================
FILE: stocks/go/packaging/windows-msi/upgrade-code.txt
================================================
dd8de1ec-bfb9-4bd9-a59a-59e092dae8cb
# This GUID is your upgrade code and ensures that you can properly update your app.
# Don't change it.

================================================
FILE: stocks/go/packaging/windows-msi/{{.packageName}}.wxs.tmpl
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" UpgradeCode="{{.upgradeCode}}" Version="{{.version}}" Language="1033" Name="{{.applicationName}}" Manufacturer="{{.author}}">
        <Package InstallerVersion="300" Compressed="yes"/>
        <Media Id="1" Cabinet="{{.packageName}}.cab" EmbedCab="yes" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="{{.applicationName}}">
                    <?include directories.wxi ?>
                </Directory>
            </Directory>
            <Directory Id="ProgramMenuFolder">
                <Directory Id="ApplicationProgramsFolder" Name="{{.applicationName}}"/>
            </Directory>
        </Directory>
        <Icon Id="ShortcutIcon" SourceFile="build{{.pathSeparator}}assets{{.pathSeparator}}icon.ico"/>
        <Property Id="ARPPRODUCTICON" Value="ShortcutIcon"/>
        <?include directory_refs.wxi ?>
        <DirectoryRef Id="ApplicationProgramsFolder">
            <Component Id="ApplicationShortcut" Guid="*">
                <Shortcut Id="ApplicationStartMenuShortcut"
                          Name="{{.applicationName}}"
                          Description="{{.description}}"
                          Target="[#{{.executableName}}.exe]"
                          WorkingDirectory="APPLICATIONROOTDIRECTORY"
                          Icon="ShortcutIcon"/>
                <RemoveFolder Id="CleanUpShortCut" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\{{.author}}\{{.packageName}}" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
            </Component>
        </DirectoryRef>
        <Feature Id="MainApplication" Title="{{.applicationName}}" Level="1">
            <ComponentRef Id="ApplicationShortcut"/>
            <?include component_refs.wxi ?>
        </Feature>
    </Product>
</Wix>


================================================
FILE: stocks/lib/i18n/.dartignore
================================================


================================================
FILE: stocks/lib/i18n/regenerate.md
================================================
## Regenerating the i18n files

The files in this directory are based on ../lib/stock_strings.dart
which defines all of the localizable strings used by the stocks
app. The stocks app uses
the [Dart `intl` package](https://github.com/dart-lang/intl).

Rebuilding everything requires two steps.

With the `examples/stocks` as the current directory, generate
`intl_messages.arb` from `lib/stock_strings.dart`:
```
flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/i18n lib/stock_strings.dart
```
The `intl_messages.arb` file is a JSON format map with one entry for
each `Intl.message()` function defined in `stock_strings.dart`. This
file was used to create the English and Spanish localizations,
`stocks_en.arb` and `stocks_es.arb`. The `intl_messages.arb` wasn't
checked into the repository, since it only serves as a template for
the other `.arb` files.


With the `examples/stocks` as the current directory, generate a
`stock_messages_<locale>.dart` for each `stocks_<locale>.arb` file and
`stock_messages_all.dart`, which imports all of the messages files:
```
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i18n \
   --generated-file-prefix=stock_ --no-use-deferred-loading lib/*.dart lib/i18n/stocks_*.arb
```

The `StockStrings` class uses the generated `initializeMessages()`
function (`stock_messages_all.dart`) to load the localized messages
and `Intl.message()` to look them up.


================================================
FILE: stocks/lib/i18n/stock_messages_all.dart
================================================
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that looks up messages for specific locales by
// delegating to the appropriate library.

import 'dart:async';

import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
// ignore: implementation_imports
import 'package:intl/src/intl_helpers.dart';

import 'stock_messages_en.dart' as messages_en;
import 'stock_messages_es.dart' as messages_es;

typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = {
  'en': () => new Future.value(null),
  'es': () => new Future.value(null),
};

MessageLookupByLibrary _findExact(localeName) {
  switch (localeName) {
    case 'en':
      return messages_en.messages;
    case 'es':
      return messages_es.messages;
    default:
      return null;
  }
}

/// User programs should call this before using [localeName] for messages.
Future<bool> initializeMessages(String localeName) async {
  var availableLocale = Intl.verifiedLocale(
    localeName,
    (locale) => _deferredLibraries[locale] != null,
    onFailure: (_) => null);
  if (availableLocale == null) {
    return new Future.value(false);
  }
  var lib = _deferredLibraries[availableLocale];
  await (lib == null ? new Future.value(false) : lib());
  initializeInternalMessageLookup(() => new CompositeMessageLookup());
  messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
  return new Future.value(true);
}

bool _messagesExistFor(String locale) {
  try {
    return _findExact(locale) != null;
  } catch (e) {
    return false;
  }
}

MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
  var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor,
      onFailure: (_) => null);
  if (actualLocale == null) return null;
  return _findExact(actualLocale);
}


================================================
FILE: stocks/lib/i18n/stock_messages_en.dart
================================================
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a en locale. All the
// messages from the main program should be duplicated here with the same
// function name.

import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';

final messages = new MessageLookup();

// ignore: unused_element
final _keepAnalysisHappy = Intl.defaultLocale;

// ignore: non_constant_identifier_names
typedef MessageIfAbsent(String message_str, List args);

class MessageLookup extends MessageLookupByLibrary {
  get localeName => 'en';

  final messages = _notInlinedMessages(_notInlinedMessages);
  static _notInlinedMessages(_) => <String, Function> {
    "market" : MessageLookupByLibrary.simpleMessage("MARKET"),
    "portfolio" : MessageLookupByLibrary.simpleMessage("PORTFOLIO"),
    "title" : MessageLookupByLibrary.simpleMessage("Stocks")
  };
}


================================================
FILE: stocks/lib/i18n/stock_messages_es.dart
================================================
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a es locale. All the
// messages from the main program should be duplicated here with the same
// function name.

import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';

final messages = new MessageLookup();

// ignore: unused_element
final _keepAnalysisHappy = Intl.defaultLocale;

// ignore: non_constant_identifier_names
typedef MessageIfAbsent(String message_str, List args);

class MessageLookup extends MessageLookupByLibrary {
  get localeName => 'es';

  final messages = _notInlinedMessages(_notInlinedMessages);
  static _notInlinedMessages(_) => <String, Function> {
    "market" : MessageLookupByLibrary.simpleMessage("MERCADO"),
    "portfolio" : MessageLookupByLibrary.simpleMessage("CARTERA"),
    "title" : MessageLookupByLibrary.simpleMessage("Acciones")
  };
}


================================================
FILE: stocks/lib/i18n/stocks_en.arb
================================================
{
  "title": "Stocks",
  "@title": {
    "description": "Title for the Stocks application",
    "type": "text",
    "placeholders": {}
  },

  "market": "MARKET",
  "@market": {
    "description": "Label for the Market tab",
    "type": "text",
    "placeholders": {}
  },

  "portfolio": "PORTFOLIO",
  "@portfolio": {
    "description": "Label for the Portfolio tab",
    "type": "text",
    "placeholders": {}
  }
}


================================================
FILE: stocks/lib/i18n/stocks_es.arb
================================================
{
  "title": "Acciones",
  "@title": {
    "description": "Title for the Stocks application",
    "type": "text",
    "placeholders": {}
  },

  "market": "MERCADO",
  "@market": {
    "description": "Label for the Market tab",
    "type": "text",
    "placeholders": {}
  },

  "portfolio": "CARTERA",
  "@portfolio": {
    "description": "Label for the Portfolio tab",
    "type": "text",
    "placeholders": {}
  }
}


================================================
FILE: stocks/lib/main.dart
================================================
import 'package:flutter/widgets.dart';
import 'package:stocks/stock.dart';

void main() {
  runApp(new StocksApp());
}


================================================
FILE: stocks/lib/main_desktop.dart
================================================
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:stocks/stock.dart';

void main() {
  debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  runApp(new StocksApp());
}


================================================
FILE: stocks/lib/stock.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library stocks;

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'
    show
        debugPaintSizeEnabled,
        debugPaintBaselinesEnabled,
        debugPaintLayerBordersEnabled,
        debugPaintPointersEnabled,
        debugRepaintRainbowEnabled;
import 'package:flutter_localizations/flutter_localizations.dart';

import 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride;

import 'stock_data.dart';
import 'stock_home.dart';
import 'stock_settings.dart';
import 'stock_strings.dart';
import 'stock_symbol_viewer.dart';
import 'stock_types.dart';

class _StocksLocalizationsDelegate extends LocalizationsDelegate<StockStrings> {
  @override
  Future<StockStrings> load(Locale locale) => StockStrings.load(locale);

  @override
  bool isSupported(Locale locale) => locale.languageCode == 'es' || locale.languageCode == 'en';

  @override
  bool shouldReload(_StocksLocalizationsDelegate old) => false;
}

class StocksApp extends StatefulWidget {
  @override
  StocksAppState createState() => new StocksAppState();
}

class StocksAppState extends State<StocksApp> {
  StockData stocks;

  StockConfiguration _configuration = new StockConfiguration(
      stockMode: StockMode.optimistic,
      backupMode: BackupMode.enabled,
      debugShowGrid: false,
      debugShowSizes: false,
      debugShowBaselines: false,
      debugShowLayers: false,
      debugShowPointers: false,
      debugShowRainbow: false,
      showPerformanceOverlay: false,
      showSemanticsDebugger: false);

  @override
  void initState() {
    super.initState();
    stocks = new StockData();
  }

  void configurationUpdater(StockConfiguration value) {
    setState(() {
      _configuration = value;
    });
  }

  ThemeData get theme {
    switch (_configuration.stockMode) {
      case StockMode.optimistic:
        return new ThemeData(brightness: Brightness.light, primarySwatch: Colors.purple, fontFamily: 'Roboto');
      case StockMode.pessimistic:
        return new ThemeData(brightness: Brightness.dark, accentColor: Colors.redAccent, fontFamily: 'Roboto');
    }
    assert(_configuration.stockMode != null);
    return null;
  }

  Route<dynamic> _getRoute(RouteSettings settings) {
    // Routes, by convention, are split on slashes, like filesystem paths.
    final List<String> path = settings.name.split('/');
    // We only support paths that start with a slash, so bail if
    // the first component is not empty:
    if (path[0] != '') return null;
    // If the path is "/stock:..." then show a stock page for the
    // specified stock symbol.
    if (path[1].startsWith('stock:')) {
      // We don't yet support subpages of a stock, so bail if there's
      // any more path components.
      if (path.length != 2) return null;
      // Extract the symbol part of "stock:..." and return a route
      // for that symbol.
      final String symbol = path[1].substring(6);
      return new MaterialPageRoute<void>(
        settings: settings,
        builder: (BuildContext context) => new StockSymbolPage(symbol: symbol, stocks: stocks),
      );
    }
    // The other paths we support are in the routes table.
    return null;
  }

  @override
  Widget build(BuildContext context) {
    assert(() {
      debugPaintSizeEnabled = _configuration.debugShowSizes;
      debugPaintBaselinesEnabled = _configuration.debugShowBaselines;
      debugPaintLayerBordersEnabled = _configuration.debugShowLayers;
      debugPaintPointersEnabled = _configuration.debugShowPointers;
      debugRepaintRainbowEnabled = _configuration.debugShowRainbow;
      return true;
    }());
    return new MaterialApp(
      title: 'Stocks',
      theme: theme,
      localizationsDelegates: <LocalizationsDelegate<dynamic>>[
        new _StocksLocalizationsDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: const <Locale>[
        const Locale('en', 'US'),
        const Locale('es', 'ES'),
      ],
      debugShowMaterialGrid: _configuration.debugShowGrid,
      showPerformanceOverlay: _configuration.showPerformanceOverlay,
      showSemanticsDebugger: _configuration.showSemanticsDebugger,
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) => new StockHome(stocks, _configuration, configurationUpdater),
        '/settings': (BuildContext context) => new StockSettings(_configuration, configurationUpdater)
      },
      onGenerateRoute: _getRoute,
    );
  }
}


================================================
FILE: stocks/lib/stock_arrow.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:math' as math;

import 'package:flutter/material.dart';

class StockArrowPainter extends CustomPainter {
  StockArrowPainter({ this.color, this.percentChange });

  final Color color;
  final double percentChange;

  @override
  void paint(Canvas canvas, Size size) {
    final Paint paint = new Paint()..color = color;
    paint.strokeWidth = 1.0;
    const double padding = 2.0;
    assert(padding > paint.strokeWidth / 2.0); // make sure the circle remains inside the box
    final double r = (size.shortestSide - padding) / 2.0; // radius of the circle
    final double centerX = padding + r;
    final double centerY = padding + r;

    // Draw the arrow.
    const double w = 8.0;
    double h = 5.0;
    double arrowY;
    if (percentChange < 0.0) {
      h = -h;
      arrowY = centerX + 1.0;
    } else {
      arrowY = centerX - 1.0;
    }
    final Path path = new Path();
    path.moveTo(centerX, arrowY - h); // top of the arrow
    path.lineTo(centerX + w, arrowY + h);
    path.lineTo(centerX - w, arrowY + h);
    path.close();
    paint.style = PaintingStyle.fill;
    canvas.drawPath(path, paint);

    // Draw a circle that circumscribes the arrow.
    paint.style = PaintingStyle.stroke;
    canvas.drawCircle(new Offset(centerX, centerY), r, paint);
  }

  @override
  bool shouldRepaint(StockArrowPainter oldDelegate) {
    return oldDelegate.color != color
        || oldDelegate.percentChange != percentChange;
  }
}

class StockArrow extends StatelessWidget {
  const StockArrow({ Key key, this.percentChange }) : super(key: key);

  final double percentChange;

  int _colorIndexForPercentChange(double percentChange) {
    const double maxPercent = 10.0;
    final double normalizedPercentChange = math.min(percentChange.abs(), maxPercent) / maxPercent;
    return 100 + (normalizedPercentChange * 8.0).floor() * 100;
  }

  Color _colorForPercentChange(double percentChange) {
    if (percentChange > 0)
      return Colors.green[_colorIndexForPercentChange(percentChange)];
    return Colors.red[_colorIndexForPercentChange(percentChange)];
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      width: 40.0,
      height: 40.0,
      margin: const EdgeInsets.symmetric(horizontal: 5.0),
      child: new CustomPaint(
        painter: new StockArrowPainter(
          // TODO(jackson): This should change colors with the theme
          color: _colorForPercentChange(percentChange),
          percentChange: percentChange
        )
      )
    );
  }
}


================================================
FILE: stocks/lib/stock_data.dart
================================================
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Snapshot from http://www.nasdaq.com/screening/company-list.aspx
// Fetched 2/23/2014.
// "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote",
// Data in stock_data.json

import 'dart:convert';
import 'dart:math' as math;

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

final math.Random _rng = new math.Random();

class Stock {
  String symbol;
  String name;
  double lastSale;
  String marketCap;
  double percentChange;

  Stock(this.symbol, this.name, this.lastSale, this.marketCap, this.percentChange);

  Stock.fromFields(List<String> fields) {
    // FIXME: This class should only have static data, not lastSale, etc.
    // "Symbol","Name","LastSale","MarketCap","IPOyear","Sector","industry","Summary Quote",
    lastSale = 0.0;
    try {
      lastSale = double.parse(fields[2]);
    } catch (_) {}
    symbol = fields[0];
    name = fields[1];
    marketCap = fields[4];
    percentChange = (_rng.nextDouble() * 20) - 10;
  }
}

class StockData extends ChangeNotifier {
  StockData() {
    if (actuallyFetchData) {
      _httpClient = new http.Client();
      _fetchNextChunk();
    }
  }

  final List<String> _symbols = <String>[];
  final Map<String, Stock> _stocks = <String, Stock>{};

  Iterable<String> get allSymbols => _symbols;

  Stock operator [](String symbol) => _stocks[symbol];

  bool get loading => _httpClient != null;

  void add(List<dynamic> data) {
    for (List<dynamic> fields in data) {
      final Stock stock = new Stock.fromFields(fields.cast<String>());
      _symbols.add(stock.symbol);
      _stocks[stock.symbol] = stock;
    }
    _symbols.sort();
    notifyListeners();
  }

  static const int _chunkCount = 30;
  int _nextChunk = 0;

  String _urlToFetch(int chunk) {
    return 'https://domokit.github.io/examples/stocks/data/stock_data_$chunk.json';
  }

  http.Client _httpClient;

  static bool actuallyFetchData = true;

  void _fetchNextChunk() {
    _httpClient.get(_urlToFetch(_nextChunk++)).then<Null>((http.Response response) {
      final String json = response.body;
      if (json == null) {
        debugPrint('Failed to load stock data chunk ${_nextChunk - 1}');
        _end();
        return;
      }
      const JsonDecoder decoder = const JsonDecoder();
      add(decoder.convert(json));
      if (_nextChunk < _chunkCount) {
        _fetchNextChunk();
      } else {
        _end();
      }
    });
  }

  void _end() {
    _httpClient?.close();
    _httpClient = null;
  }
}


================================================
FILE: stocks/lib/stock_home.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart' show debugDumpRenderTree, debugDumpLayerTree, debugDumpSemanticsTree, DebugSemanticsDumpOrder;
import 'package:flutter/scheduler.dart' show timeDilation;
import 'stock_data.dart';
import 'stock_list.dart';
import 'stock_strings.dart';
import 'stock_symbol_viewer.dart';
import 'stock_types.dart';

typedef void ModeUpdater(StockMode mode);

enum _StockMenuItem { autorefresh, refresh, speedUp, speedDown }
enum StockHomeTab { market, portfolio }

class _NotImplementedDialog extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new AlertDialog(
      title: const Text('Not Implemented'),
      content: const Text('This feature has not yet been implemented.'),
      actions: <Widget>[
        new FlatButton(
          onPressed: debugDumpApp,
          child: new Row(
            children: <Widget>[
              const Icon(
                Icons.dvr,
                size: 18.0,
              ),
              new Container(
                width: 8.0,
              ),
              const Text('DUMP APP TO CONSOLE'),
            ],
          ),
        ),
        new FlatButton(
          onPressed: () {
            Navigator.pop(context, false);
          },
          child: const Text('OH WELL'),
        ),
      ],
    );
  }
}

class StockHome extends StatefulWidget {
  const StockHome(this.stocks, this.configuration, this.updater);

  final StockData stocks;
  final StockConfiguration configuration;
  final ValueChanged<StockConfiguration> updater;

  @override
  StockHomeState createState() => new StockHomeState();
}

class StockHomeState extends State<StockHome> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  final TextEditingController _searchQuery = new TextEditingController();
  bool _isSearching = false;
  bool _autorefresh = false;

  void _handleSearchBegin() {
    ModalRoute.of(context).addLocalHistoryEntry(new LocalHistoryEntry(
      onRemove: () {
        setState(() {
          _isSearching = false;
          _searchQuery.clear();
        });
      },
    ));
    setState(() {
      _isSearching = true;
    });
  }

  void _handleStockModeChange(StockMode value) {
    if (widget.updater != null)
      widget.updater(widget.configuration.copyWith(stockMode: value));
  }

  void _handleStockMenu(BuildContext context, _StockMenuItem value) {
    switch (value) {
      case _StockMenuItem.autorefresh:
        setState(() {
          _autorefresh = !_autorefresh;
        });
        break;
      case _StockMenuItem.refresh:
        showDialog<void>(
          context: context,
          builder: (BuildContext context) => new _NotImplementedDialog(),
        );
        break;
      case _StockMenuItem.speedUp:
        timeDilation /= 5.0;
        break;
      case _StockMenuItem.speedDown:
        timeDilation *= 5.0;
        break;
    }
  }

  Widget _buildDrawer(BuildContext context) {
    return new Drawer(
      child: new ListView(
        children: <Widget>[
          const DrawerHeader(child: const Center(child: const Text('Stocks'))),
          const ListTile(
            leading: const Icon(Icons.assessment),
            title: const Text('Stock List'),
            selected: true,
          ),
          const ListTile(
            leading: const Icon(Icons.account_balance),
            title: const Text('Account Balance'),
            enabled: false,
          ),
          new ListTile(
            leading: const Icon(Icons.dvr),
            title: const Text('Dump App to Console'),
            onTap: () {
              try {
                debugDumpApp();
                debugDumpRenderTree();
                debugDumpLayerTree();
                debugDumpSemanticsTree(DebugSemanticsDumpOrder.traversalOrder);
              } catch (e, stack) {
                debugPrint('Exception while dumping app:\n$e\n$stack');
              }
            },
          ),
          const Divider(),
          new ListTile(
            leading: const Icon(Icons.thumb_up),
            title: const Text('Optimistic'),
            trailing: new Radio<StockMode>(
              value: StockMode.optimistic,
              groupValue: widget.configuration.stockMode,
              onChanged: _handleStockModeChange,
            ),
            onTap: () {
              _handleStockModeChange(StockMode.optimistic);
            },
          ),
          new ListTile(
            leading: const Icon(Icons.thumb_down),
            title: const Text('Pessimistic'),
            trailing: new Radio<StockMode>(
              value: StockMode.pessimistic,
              groupValue: widget.configuration.stockMode,
              onChanged: _handleStockModeChange,
            ),
            onTap: () {
              _handleStockModeChange(StockMode.pessimistic);
            },
          ),
          const Divider(),
          new ListTile(
            leading: const Icon(Icons.settings),
            title: const Text('Settings'),
            onTap: _handleShowSettings,
          ),
          new ListTile(
            leading: const Icon(Icons.help),
            title: const Text('About'),
            onTap: _handleShowAbout,
          ),
        ],
      ),
    );
  }

  void _handleShowSettings() {
    Navigator.popAndPushNamed(context, '/settings');
  }

  void _handleShowAbout() {
    showAboutDialog(context: context);
  }

  Widget buildAppBar() {
    return new AppBar(
      elevation: 0.0,
      title: new Text(StockStrings.of(context).title()),
      actions: <Widget>[
        new IconButton(
          icon: const Icon(Icons.search),
          onPressed: _handleSearchBegin,
          tooltip: 'Search',
        ),
        new PopupMenuButton<_StockMenuItem>(
          onSelected: (_StockMenuItem value) { _handleStockMenu(context, value); },
          itemBuilder: (BuildContext context) => <PopupMenuItem<_StockMenuItem>>[
            new CheckedPopupMenuItem<_StockMenuItem>(
              value: _StockMenuItem.autorefresh,
              checked: _autorefresh,
              child: const Text('Autorefresh'),
            ),
            const PopupMenuItem<_StockMenuItem>(
              value: _StockMenuItem.refresh,
              child: const Text('Refresh'),
            ),
            const PopupMenuItem<_StockMenuItem>(
              value: _StockMenuItem.speedUp,
              child: const Text('Increase animation speed'),
            ),
            const PopupMenuItem<_StockMenuItem>(
              value: _StockMenuItem.speedDown,
              child: const Text('Decrease animation speed'),
            ),
          ],
        ),
      ],
      bottom: new TabBar(
        tabs: <Widget>[
          new Tab(text: StockStrings.of(context).market()),
          new Tab(text: StockStrings.of(context).portfolio()),
        ],
      ),
    );
  }

  static Iterable<Stock> _getStockList(StockData stocks, Iterable<String> symbols) {
    return symbols.map<Stock>((String symbol) => stocks[symbol])
        .where((Stock stock) => stock != null);
  }

  Iterable<Stock> _filterBySearchQuery(Iterable<Stock> stocks) {
    if (_searchQuery.text.isEmpty)
      return stocks;
    final RegExp regexp = new RegExp(_searchQuery.text, caseSensitive: false);
    return stocks.where((Stock stock) => stock.symbol.contains(regexp));
  }

  void _buyStock(Stock stock) {
    setState(() {
      stock.percentChange = 100.0 * (1.0 / stock.lastSale);
      stock.lastSale += 1.0;
    });
    _scaffoldKey.currentState.showSnackBar(new SnackBar(
      content: new Text('Purchased ${stock.symbol} for ${stock.lastSale}'),
      action: new SnackBarAction(
        label: 'BUY MORE',
        onPressed: () {
          _buyStock(stock);
        },
      ),
    ));
  }

  Widget _buildStockList(BuildContext context, Iterable<Stock> stocks, StockHomeTab tab) {
    return new StockList(
      stocks: stocks.toList(),
      onAction: _buyStock,
      onOpen: (Stock stock) {
        Navigator.pushNamed(context, '/stock:${stock.symbol}');
      },
      onShow: (Stock stock) {
        _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) => new StockSymbolBottomSheet(stock: stock));
      },
    );
  }

  Widget _buildStockTab(BuildContext context, StockHomeTab tab, List<String> stockSymbols) {
    return new AnimatedBuilder(
      key: new ValueKey<StockHomeTab>(tab),
      animation: new Listenable.merge(<Listenable>[_searchQuery, widget.stocks]),
      builder: (BuildContext context, Widget child) {
        return _buildStockList(context, _filterBySearchQuery(_getStockList(widget.stocks, stockSymbols)).toList(), tab);
      },
    );
  }

  static const List<String> portfolioSymbols = const <String>['AAPL','FIZZ', 'FIVE', 'FLAT', 'ZINC', 'ZNGA'];

  Widget buildSearchBar() {
    return new AppBar(
      leading: new BackButton(
        color: Theme.of(context).accentColor,
      ),
      title: new TextField(
        controller: _searchQuery,
        autofocus: true,
        decoration: const InputDecoration(
          hintText: 'Search stocks',
        ),
      ),
      backgroundColor: Theme.of(context).canvasColor,
    );
  }

  void _handleCreateCompany() {
    showModalBottomSheet<void>(
      context: context,
      builder: (BuildContext context) => new _CreateCompanySheet(),
    );
  }

  Widget buildFloatingActionButton() {
    return new FloatingActionButton(
      tooltip: 'Create company',
      child: const Icon(Icons.add),
      backgroundColor: Theme.of(context).accentColor,
      onPressed: _handleCreateCompany,
    );
  }

  @override
  Widget build(BuildContext context) {
    return new DefaultTabController(
      length: 2,
      child: new Scaffold(
        key: _scaffoldKey,
        appBar: _isSearching ? buildSearchBar() : buildAppBar(),
        floatingActionButton: buildFloatingActionButton(),
        drawer: _buildDrawer(context),
        body: new TabBarView(
          children: <Widget>[
            _buildStockTab(context, StockHomeTab.market, widget.stocks.allSymbols),
            _buildStockTab(context, StockHomeTab.portfolio, portfolioSymbols),
          ],
        ),
      ),
    );
  }
}

class _CreateCompanySheet extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Column(
      children: const <Widget>[
        const TextField(
          autofocus: true,
          decoration: const InputDecoration(
            hintText: 'Company Name',
          ),
        ),
        const Text('(This demo is not yet complete.)'),
        // For example, we could add a button that actually updates the list
        // and then contacts the server, etc.
      ],
    );
  }
}


================================================
FILE: stocks/lib/stock_list.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

import 'stock_data.dart';
import 'stock_row.dart';

class StockList extends StatelessWidget {
  const StockList({ Key key, this.stocks, this.onOpen, this.onShow, this.onAction }) : super(key: key);

  final List<Stock> stocks;
  final StockRowActionCallback onOpen;
  final StockRowActionCallback onShow;
  final StockRowActionCallback onAction;

  @override
  Widget build(BuildContext context) {
    return new ListView.builder(
      key: const ValueKey<String>('stock-list'),
      itemExtent: StockRow.kHeight,
      itemCount: stocks.length,
      itemBuilder: (BuildContext context, int index) {
        return new StockRow(
          stock: stocks[index],
          onPressed: onOpen,
          onDoubleTap: onShow,
          onLongPressed: onAction
        );
      },
    );
  }
}


================================================
FILE: stocks/lib/stock_row.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

import 'stock_arrow.dart';
import 'stock_data.dart';

typedef void StockRowActionCallback(Stock stock);

class StockRow extends StatelessWidget {
  StockRow({
    this.stock,
    this.onPressed,
    this.onDoubleTap,
    this.onLongPressed
  }) : super(key: new ObjectKey(stock));

  final Stock stock;
  final StockRowActionCallback onPressed;
  final StockRowActionCallback onDoubleTap;
  final StockRowActionCallback onLongPressed;

  static const double kHeight = 79.0;

  GestureTapCallback _getHandler(StockRowActionCallback callback) {
    return callback == null ? null : () => callback(stock);
  }

  @override
  Widget build(BuildContext context) {
    final String lastSale = '\$${stock.lastSale.toStringAsFixed(2)}';
    String changeInPrice = '${stock.percentChange.toStringAsFixed(2)}%';
    if (stock.percentChange > 0)
      changeInPrice = '+' + changeInPrice;
    return new InkWell(
      onTap: _getHandler(onPressed),
      onDoubleTap: _getHandler(onDoubleTap),
      onLongPress: _getHandler(onLongPressed),
      child: new Container(
        padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 20.0),
        decoration: new BoxDecoration(
          border: new Border(
            bottom: new BorderSide(color: Theme.of(context).dividerColor)
          )
        ),
        child: new Row(
          children: <Widget>[
            new Container(
              margin: const EdgeInsets.only(right: 5.0),
              child: new Hero(
                tag: stock,
                child: new StockArrow(percentChange: stock.percentChange)
              )
            ),
            new Expanded(
              child: new Row(
                children: <Widget>[
                  new Expanded(
                    flex: 2,
                    child: new Text(
                      stock.symbol
                    )
                  ),
                  new Expanded(
                    child: new Text(
                      lastSale,
                      textAlign: TextAlign.right
                    )
                  ),
                  new Expanded(
                    child: new Text(
                      changeInPrice,
                      textAlign: TextAlign.right
                    )
                  ),
                ],
                crossAxisAlignment: CrossAxisAlignment.baseline,
                textBaseline: DefaultTextStyle.of(context).style.textBaseline
              )
            ),
          ]
        )
      )
    );
  }
}


================================================
FILE: stocks/lib/stock_settings.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

import 'stock_types.dart';

class StockSettings extends StatefulWidget {
  const StockSettings(this.configuration, this.updater);

  final StockConfiguration configuration;
  final ValueChanged<StockConfiguration> updater;

  @override
  StockSettingsState createState() => new StockSettingsState();
}

class StockSettingsState extends State<StockSettings> {
  void _handleOptimismChanged(bool value) {
    value ??= false;
    sendUpdates(widget.configuration.copyWith(stockMode: value ? StockMode.optimistic : StockMode.pessimistic));
  }

  void _handleBackupChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(backupMode: value ? BackupMode.enabled : BackupMode.disabled));
  }

  void _handleShowGridChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowGrid: value));
  }

  void _handleShowSizesChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowSizes: value));
  }

  void _handleShowBaselinesChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowBaselines: value));
  }

  void _handleShowLayersChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowLayers: value));
  }

  void _handleShowPointersChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowPointers: value));
  }

  void _handleShowRainbowChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(debugShowRainbow: value));
  }


  void _handleShowPerformanceOverlayChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(showPerformanceOverlay: value));
  }

  void _handleShowSemanticsDebuggerChanged(bool value) {
    sendUpdates(widget.configuration.copyWith(showSemanticsDebugger: value));
  }

  void _confirmOptimismChange() {
    switch (widget.configuration.stockMode) {
      case StockMode.optimistic:
        _handleOptimismChanged(false);
        break;
      case StockMode.pessimistic:
        showDialog<bool>(
          context: context,
           builder: (BuildContext context) {
            return new AlertDialog(
              title: const Text('Change mode?'),
              content: const Text('Optimistic mode means everything is awesome. Are you sure you can handle that?'),
              actions: <Widget>[
                new FlatButton(
                  child: const Text('NO THANKS'),
                  onPressed: () {
                    Navigator.pop(context, false);
                  }
                ),
                new FlatButton(
                  child: const Text('AGREE'),
                  onPressed: () {
                    Navigator.pop(context, true);
                  }
                ),
              ],
            );
          },
        ).then<void>(_handleOptimismChanged);
        break;
    }
  }

  void sendUpdates(StockConfiguration value) {
    if (widget.updater != null)
      widget.updater(value);
  }

  Widget buildAppBar(BuildContext context) {
    return new AppBar(
      title: const Text('Settings')
    );
  }

  Widget buildSettingsPane(BuildContext context) {
    final List<Widget> rows = <Widget>[
      new ListTile(
        leading: const Icon(Icons.thumb_up),
        title: const Text('Everything is awesome'),
        onTap: _confirmOptimismChange,
        trailing: new Checkbox(
          value: widget.configuration.stockMode == StockMode.optimistic,
          onChanged: (bool value) => _confirmOptimismChange(),
        ),
      ),
      new ListTile(
        leading: const Icon(Icons.backup),
        title: const Text('Back up stock list to the cloud'),
        onTap: () { _handleBackupChanged(!(widget.configuration.backupMode == BackupMode.enabled)); },
        trailing: new Switch(
          value: widget.configuration.backupMode == BackupMode.enabled,
          onChanged: _handleBackupChanged,
        ),
      ),
      new ListTile(
        leading: const Icon(Icons.picture_in_picture),
        title: const Text('Show rendering performance overlay'),
        onTap: () { _handleShowPerformanceOverlayChanged(!widget.configuration.showPerformanceOverlay); },
        trailing: new Switch(
          value: widget.configuration.showPerformanceOverlay,
          onChanged: _handleShowPerformanceOverlayChanged,
        ),
      ),
      new ListTile(
        leading: const Icon(Icons.accessibility),
        title: const Text('Show semantics overlay'),
        onTap: () { _handleShowSemanticsDebuggerChanged(!widget.configuration.showSemanticsDebugger); },
        trailing: new Switch(
          value: widget.configuration.showSemanticsDebugger,
          onChanged: _handleShowSemanticsDebuggerChanged,
        ),
      ),
    ];
    assert(() {
      // material grid and size construction lines are only available in checked mode
      rows.addAll(<Widget>[
        new ListTile(
          leading: const Icon(Icons.border_clear),
          title: const Text('Show material grid (for debugging)'),
          onTap: () { _handleShowGridChanged(!widget.configuration.debugShowGrid); },
          trailing: new Switch(
            value: widget.configuration.debugShowGrid,
            onChanged: _handleShowGridChanged,
          ),
        ),
        new ListTile(
          leading: const Icon(Icons.border_all),
          title: const Text('Show construction lines (for debugging)'),
          onTap: () { _handleShowSizesChanged(!widget.configuration.debugShowSizes); },
          trailing: new Switch(
            value: widget.configuration.debugShowSizes,
            onChanged: _handleShowSizesChanged,
          ),
        ),
        new ListTile(
          leading: const Icon(Icons.format_color_text),
          title: const Text('Show baselines (for debugging)'),
          onTap: () { _handleShowBaselinesChanged(!widget.configuration.debugShowBaselines); },
          trailing: new Switch(
            value: widget.configuration.debugShowBaselines,
            onChanged: _handleShowBaselinesChanged,
          ),
        ),
        new ListTile(
          leading: const Icon(Icons.filter_none),
          title: const Text('Show layer boundaries (for debugging)'),
          onTap: () { _handleShowLayersChanged(!widget.configuration.debugShowLayers); },
          trailing: new Switch(
            value: widget.configuration.debugShowLayers,
            onChanged: _handleShowLayersChanged,
          ),
        ),
        new ListTile(
          leading: const Icon(Icons.mouse),
          title: const Text('Show pointer hit-testing (for debugging)'),
          onTap: () { _handleShowPointersChanged(!widget.configuration.debugShowPointers); },
          trailing: new Switch(
            value: widget.configuration.debugShowPointers,
            onChanged: _handleShowPointersChanged,
          ),
        ),
        new ListTile(
          leading: const Icon(Icons.gradient),
          title: const Text('Show repaint rainbow (for debugging)'),
          onTap: () { _handleShowRainbowChanged(!widget.configuration.debugShowRainbow); },
          trailing: new Switch(
            value: widget.configuration.debugShowRainbow,
            onChanged: _handleShowRainbowChanged,
          ),
        ),
      ]);
      return true;
    }());
    return new ListView(
      padding: const EdgeInsets.symmetric(vertical: 20.0),
      children: rows,
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: buildAppBar(context),
      body: buildSettingsPane(context)
    );
  }
}


================================================
FILE: stocks/lib/stock_strings.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:intl/intl.dart';
import 'package:flutter/widgets.dart';

import 'i18n/stock_messages_all.dart';

// Information about how this file relates to i18n/stock_messages_all.dart and how the i18n files
// were generated can be found in i18n/regenerate.md.

class StockStrings {
  StockStrings(Locale locale) : _localeName = locale.toString();

  final String _localeName;

  static Future<StockStrings> load(Locale locale) {
    return initializeMessages(locale.toString())
      .then((Object _) {
        return new StockStrings(locale);
      });
  }

  static StockStrings of(BuildContext context) {
    return Localizations.of<StockStrings>(context, StockStrings);
  }

  String title() {
    return Intl.message(
      '<Stocks>',
      name: 'title',
      desc: 'Title for the Stocks application',
      locale: _localeName,
    );
  }

  String market() => Intl.message(
    'MARKET',
    name: 'market',
    desc: 'Label for the Market tab',
    locale: _localeName,
  );

  String portfolio() => Intl.message(
    'PORTFOLIO',
    name: 'portfolio',
    desc: 'Label for the Portfolio tab',
    locale: _localeName,
  );
}


================================================
FILE: stocks/lib/stock_symbol_viewer.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

import 'stock_arrow.dart';
import 'stock_data.dart';

class _StockSymbolView extends StatelessWidget {
  const _StockSymbolView({ this.stock, this.arrow });

  final Stock stock;
  final Widget arrow;

  @override
  Widget build(BuildContext context) {
    assert(stock != null);
    final String lastSale = '\$${stock.lastSale.toStringAsFixed(2)}';
    String changeInPrice = '${stock.percentChange.toStringAsFixed(2)}%';
    if (stock.percentChange > 0)
      changeInPrice = '+' + changeInPrice;

    return new Container(
      padding: const EdgeInsets.all(20.0),
      child: new Column(
        children: <Widget>[
          new Row(
            children: <Widget>[
              new Text(
                '${stock.symbol}',
              ),
              arrow,
            ],
            mainAxisAlignment: MainAxisAlignment.spaceBetween
          ),
          new Text('Last Sale'),
          new Text('$lastSale ($changeInPrice)'),
          new Container(
            height: 8.0
          ),
          new Text('Market Cap'),
          new Text('${stock.marketCap}'),
          new Container(
            height: 8.0
          ),
          new RichText(
            text: new TextSpan(
              style: DefaultTextStyle.of(context).style.merge(const TextStyle(fontSize: 8.0)),
              text: 'Prices may be delayed by ',
              children: const <TextSpan>[
                const TextSpan(text: 'several', style: const TextStyle(fontStyle: FontStyle.italic)),
                const TextSpan(text: ' years.'),
              ]
            )
          ),
        ],
        mainAxisSize: MainAxisSize.min
      )
    );
  }
}

class StockSymbolPage extends StatelessWidget {
  const StockSymbolPage({ this.symbol, this.stocks });

  final String symbol;
  final StockData stocks;

  @override
  Widget build(BuildContext context) {
    return new AnimatedBuilder(
      animation: stocks,
      builder: (BuildContext context, Widget child) {
        final Stock stock = stocks[symbol];
        return new Scaffold(
          appBar: new AppBar(
            title: new Text(stock?.name ?? symbol)
          ),
          body: new SingleChildScrollView(
            child: new Container(
              margin: const EdgeInsets.all(20.0),
              child: new Card(
                child: new AnimatedCrossFade(
                  duration: const Duration(milliseconds: 300),
                  firstChild: const Padding(
                    padding: const EdgeInsets.all(20.0),
                    child: const Center(child: const CircularProgressIndicator()),
                  ),
                  secondChild: stock != null
                    ? new _StockSymbolView(
                      stock: stock,
                      arrow: new Hero(
                        tag: stock,
                        child: new StockArrow(percentChange: stock.percentChange),
                      ),
                    ) : new Padding(
                        padding: const EdgeInsets.all(20.0),
                        child: new Center(child: new Text('$symbol not found')),
                    ),
                  crossFadeState: stock == null && stocks.loading ? CrossFadeState.showFirst : CrossFadeState.showSecond,
                ),
              )
            )
          )
        );
      },
    );
  }
}

class StockSymbolBottomSheet extends StatelessWidget {
  const StockSymbolBottomSheet({ this.stock });

  final Stock stock;

  @override
  Widget build(BuildContext context) {
    return new Container(
      padding: const EdgeInsets.all(10.0),
      decoration: const BoxDecoration(
        border: const Border(top: const BorderSide(color: Colors.black26))
      ),
      child: new _StockSymbolView(
        stock: stock,
        arrow: new StockArrow(percentChange: stock.percentChange)
      )
   );
  }
}


================================================
FILE: stocks/lib/stock_types.dart
================================================
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';

enum StockMode { optimistic, pessimistic }
enum BackupMode { enabled, disabled }

class StockConfiguration {
  StockConfiguration({
    @required this.stockMode,
    @required this.backupMode,
    @required this.debugShowGrid,
    @required this.debugShowSizes,
    @required this.debugShowBaselines,
    @required this.debugShowLayers,
    @required this.debugShowPointers,
    @required this.debugShowRainbow,
    @required this.showPerformanceOverlay,
    @required this.showSemanticsDebugger
  }) : assert(stockMode != null),
       assert(backupMode != null),
       assert(debugShowGrid != null),
       assert(debugShowSizes != null),
       assert(debugShowBaselines != null),
       assert(debugShowLayers != null),
       assert(debugShowPointers != null),
       assert(debugShowRainbow != null),
       assert(showPerformanceOverlay != null),
       assert(showSemanticsDebugger != null);

  final StockMode stockMode;
  final BackupMode backupMode;
  final bool debugShowGrid;
  final bool debugShowSizes;
  final bool debugShowBaselines;
  final bool debugShowLayers;
  final bool debugShowPointers;
  final bool debugShowRainbow;
  final bool showPerformanceOverlay;
  final bool showSemanticsDebugger;

  StockConfiguration copyWith({
    StockMode stockMode,
    BackupMode backupMode,
    bool debugShowGrid,
    bool debugShowSizes,
    bool debugShowBaselines,
    bool debugShowLayers,
    bool debugShowPointers,
    bool debugShowRainbow,
    bool showPerformanceOverlay,
    bool showSemanticsDebugger
  }) {
    return new StockConfiguration(
      stockMode: stockMode ?? this.stockMode,
      backupMode: backupMode ?? this.backupMode,
      debugShowGrid: debugShowGrid ?? this.debugShowGrid,
      debugShowSizes: debugShowSizes ?? this.debugShowSizes,
      debugShowBaselines: debugShowBaselines ?? this.debugShowBaselines,
      debugShowLayers: debugShowLayers ?? this.debugShowLayers,
      debugShowPointers: debugShowPointers ?? this.debugShowPointers,
      debugShowRainbow: debugShowRainbow ?? this.debugShowRainbow,
      showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay,
      showSemanticsDebugger: showSemanticsDebugger ?? this.showSemanticsDebugger
    );
  }
}


================================================
FILE: stocks/pubspec.yaml
================================================
name: stocks
description: A simple stocks application

environment:
  # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
  sdk: ">=2.0.0-dev.68.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl:
  http:

flutter:
  uses-material-design: true

  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto/Roboto-Thin.ttf
          weight: 100
        - asset: fonts/Roboto/Roboto-Light.ttf
          weight: 300
        - asset: fonts/Roboto/Roboto-Regular.ttf
          weight: 400
        - asset: fonts/Roboto/Roboto-Medium.ttf
          weight: 500
        - asset: fonts/Roboto/Roboto-Bold.ttf
          weight: 700
        - asset: fonts/Roboto/Roboto-Black.ttf
          weight: 900


================================================
FILE: text_demo/.gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# Visual Studio Code related
.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages


================================================
FILE: text_demo/fonts/Roboto/LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred b
Download .txt
gitextract_wdz4x0ao/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── draggable_borderless/
│   ├── .gitignore
│   ├── .metadata
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── keyboard_event/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── plugin_tutorial/
│   ├── .gitignore
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── go-plugin-example/
│   │   ├── battery/
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   └── complex/
│   │       ├── go.mod
│   │       ├── go.sum
│   │       └── main.go
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── pointer_demo/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── renovate.json
├── stocks/
│   ├── .gitignore
│   ├── README.md
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── hover.yaml
│   │   └── packaging/
│   │       ├── darwin-bundle/
│   │       │   └── {{.applicationName}} {{.version}}.app/
│   │       │       └── Contents/
│   │       │           └── Info.plist.tmpl
│   │       ├── darwin-pkg/
│   │       │   └── flat/
│   │       │       ├── Distribution.tmpl
│   │       │       └── base.pkg/
│   │       │           └── PackageInfo.tmpl
│   │       ├── linux-appimage/
│   │       │   ├── AppRun.tmpl
│   │       │   └── {{.packageName}}.desktop.tmpl
│   │       ├── linux-deb/
│   │       │   ├── DEBIAN/
│   │       │   │   └── control.tmpl
│   │       │   └── usr/
│   │       │       ├── bin/
│   │       │       │   └── {{.executableName}}.tmpl
│   │       │       └── share/
│   │       │           └── applications/
│   │       │               └── {{.executableName}}.desktop.tmpl
│   │       ├── linux-pkg/
│   │       │   ├── PKGBUILD.tmpl
│   │       │   └── src/
│   │       │       └── usr/
│   │       │           ├── bin/
│   │       │           │   └── {{.executableName}}.tmpl
│   │       │           └── share/
│   │       │               └── applications/
│   │       │                   └── {{.executableName}}.desktop.tmpl
│   │       ├── linux-rpm/
│   │       │   ├── BUILDROOT/
│   │       │   │   └── {{.packageName}}-{{.version}}-{{.release}}.x86_64/
│   │       │   │       └── usr/
│   │       │   │           ├── bin/
│   │       │   │           │   └── {{.executableName}}.tmpl
│   │       │   │           └── share/
│   │       │   │               └── applications/
│   │       │   │                   └── {{.executableName}}.desktop.tmpl
│   │       │   └── SPECS/
│   │       │       └── {{.packageName}}.spec.tmpl
│   │       ├── linux-snap/
│   │       │   └── snap/
│   │       │       ├── local/
│   │       │       │   └── {{.executableName}}.desktop.tmpl
│   │       │       └── snapcraft.yaml.tmpl
│   │       └── windows-msi/
│   │           ├── upgrade-code.txt
│   │           └── {{.packageName}}.wxs.tmpl
│   ├── lib/
│   │   ├── i18n/
│   │   │   ├── .dartignore
│   │   │   ├── regenerate.md
│   │   │   ├── stock_messages_all.dart
│   │   │   ├── stock_messages_en.dart
│   │   │   ├── stock_messages_es.dart
│   │   │   ├── stocks_en.arb
│   │   │   └── stocks_es.arb
│   │   ├── main.dart
│   │   ├── main_desktop.dart
│   │   ├── stock.dart
│   │   ├── stock_arrow.dart
│   │   ├── stock_data.dart
│   │   ├── stock_home.dart
│   │   ├── stock_list.dart
│   │   ├── stock_row.dart
│   │   ├── stock_settings.dart
│   │   ├── stock_strings.dart
│   │   ├── stock_symbol_viewer.dart
│   │   └── stock_types.dart
│   └── pubspec.yaml
├── text_demo/
│   ├── .gitignore
│   ├── fonts/
│   │   └── Roboto/
│   │       └── LICENSE.txt
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── lib/
│   │   ├── app.dart
│   │   ├── main.dart
│   │   └── main_desktop.dart
│   └── pubspec.yaml
├── texture_tutorial/
│   ├── .gitignore
│   ├── README.md
│   ├── go/
│   │   ├── .gitignore
│   │   ├── cmd/
│   │   │   ├── main.go
│   │   │   └── options.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── hover.yaml
│   ├── go-texture-example/
│   │   ├── gif/
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   └── main.go
│   │   └── image/
│   │       ├── go.mod
│   │       ├── go.sum
│   │       └── main.go
│   ├── lib/
│   │   └── main_desktop.dart
│   └── pubspec.yaml
└── xbox_controller/
    ├── .gitignore
    ├── README.md
    ├── fonts/
    │   └── Roboto/
    │       └── LICENSE.txt
    ├── go/
    │   ├── .gitignore
    │   ├── cmd/
    │   │   ├── import-path_provider-plugin.go
    │   │   ├── main.go
    │   │   └── options.go
    │   ├── go.mod
    │   ├── go.sum
    │   └── hover.yaml
    ├── go-plugin-example/
    │   └── controller/
    │       ├── go.mod
    │       ├── go.sum
    │       └── main.go
    ├── lib/
    │   ├── game.dart
    │   ├── main.dart
    │   └── main_desktop.dart
    └── pubspec.yaml
Download .txt
SYMBOL INDEX (210 symbols across 45 files)

FILE: draggable_borderless/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: draggable_borderless/go/cmd/options.go
  type AppBarDraggable (line 16) | type AppBarDraggable struct
    method InitPlugin (line 27) | func (p *AppBarDraggable) InitPlugin(messenger plugin.BinaryMessenger)...
    method InitPluginGLFW (line 36) | func (p *AppBarDraggable) InitPluginGLFW(window *glfw.Window) error {
    method onPanStart (line 44) | func (p *AppBarDraggable) onPanStart(arguments interface{}) (reply int...
    method onPanUpdate (line 53) | func (p *AppBarDraggable) onPanUpdate(arguments interface{}) (reply in...
    method onClose (line 64) | func (p *AppBarDraggable) onClose(arguments interface{}) (reply interf...

FILE: draggable_borderless/lib/main_desktop.dart
  function main (line 7) | void main()
  class MyApp (line 12) | class MyApp extends StatelessWidget {
    method build (line 15) | Widget build(BuildContext context)
  class DraggebleAppBar (line 43) | class DraggebleAppBar extends StatelessWidget implements PreferredSizeWi...
    method build (line 64) | Widget build(BuildContext context)
    method onPanUpdate (line 72) | void onPanUpdate(DragUpdateDetails details)
    method onPanStart (line 76) | void onPanStart(DragStartDetails details)

FILE: keyboard_event/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: keyboard_event/lib/app.dart
  class MyApp (line 5) | class MyApp extends StatelessWidget {
    method build (line 8) | Widget build(BuildContext context)
  class KeyboardTestPage (line 23) | class KeyboardTestPage extends StatefulWidget {
    method createState (line 25) | State<StatefulWidget> createState()
  class _KeyboardTestPageState (line 30) | class _KeyboardTestPageState extends State<KeyboardTestPage> {
    method didChangeDependencies (line 37) | void didChangeDependencies()
    method build (line 43) | Widget build(BuildContext context)
    method onKeyEvent (line 63) | void onKeyEvent(RawKeyEvent event)
    method _addMessage (line 80) | void _addMessage(String message)

FILE: keyboard_event/lib/main.dart
  function main (line 5) | void main()

FILE: keyboard_event/lib/main_desktop.dart
  function main (line 7) | void main()

FILE: plugin_tutorial/go-plugin-example/battery/main.go
  constant channelName (line 9) | channelName = "samples.flutter.dev/battery"
  type MyBatteryPlugin (line 16) | type MyBatteryPlugin struct
    method InitPlugin (line 33) | func (p *MyBatteryPlugin) InitPlugin(messenger plugin.BinaryMessenger)...
  function handleGetBatteryLevel (line 45) | func handleGetBatteryLevel(arguments interface{}) (reply interface{}, er...

FILE: plugin_tutorial/go-plugin-example/complex/main.go
  type Example (line 15) | type Example struct
    method InitPlugin (line 23) | func (p *Example) InitPlugin(messenger plugin.BinaryMessenger) error {
    method mutualCall (line 34) | func (p *Example) mutualCall(arguments interface{}) (reply interface{}...
  function catchAllTest (line 55) | func catchAllTest(methodCall interface{}) (reply interface{}, err error) {
  function getRemotesFunc (line 61) | func getRemotesFunc(arguments interface{}) (reply interface{}, err error) {
  function getErrorFunc (line 94) | func getErrorFunc(arguments interface{}) (reply interface{}, err error) {

FILE: plugin_tutorial/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: plugin_tutorial/lib/main_desktop.dart
  function main (line 12) | void main()

FILE: pointer_demo/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: pointer_demo/lib/app.dart
  function main (line 7) | void main()
  class MyApp (line 9) | class MyApp extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)
  class MyStatefulWidget (line 26) | class MyStatefulWidget extends StatefulWidget {
    method createState (line 30) | _MyStatefulWidgetState createState()
  class _MyStatefulWidgetState (line 33) | class _MyStatefulWidgetState extends State<MyStatefulWidget> {
    method _incrementCounter (line 40) | void _incrementCounter(PointerEnterEvent details)
    method _decrementCounter (line 46) | void _decrementCounter(PointerExitEvent details)
    method _updateLocation (line 52) | void _updateLocation(PointerHoverEvent details)
    method _updateMove (line 60) | void _updateMove(PointerMoveEvent details)
    method _pointerDown (line 68) | void _pointerDown(PointerDownEvent details)
    method _pointerUp (line 76) | void _pointerUp(PointerUpEvent details)
    method build (line 85) | Widget build(BuildContext context)

FILE: pointer_demo/lib/main.dart
  function main (line 5) | void main()

FILE: pointer_demo/lib/main_desktop.dart
  function main (line 6) | void main()

FILE: stocks/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: stocks/lib/i18n/stock_messages_all.dart
  type Future (line 15) | typedef Future<dynamic> LibraryLoader();
  function _findExact (line 21) | MessageLookupByLibrary _findExact(localeName)
  function initializeMessages (line 33) | Future<bool> initializeMessages(String localeName)
  function _messagesExistFor (line 48) | bool _messagesExistFor(String locale)
  function _findGeneratedMessagesFor (line 56) | MessageLookupByLibrary _findGeneratedMessagesFor(locale)

FILE: stocks/lib/i18n/stock_messages_en.dart
  type MessageIfAbsent (line 15) | typedef MessageIfAbsent(String message_str, List args);
  class MessageLookup (line 17) | class MessageLookup extends MessageLookupByLibrary {
    method _notInlinedMessages (line 21) | _notInlinedMessages(_)

FILE: stocks/lib/i18n/stock_messages_es.dart
  type MessageIfAbsent (line 15) | typedef MessageIfAbsent(String message_str, List args);
  class MessageLookup (line 17) | class MessageLookup extends MessageLookupByLibrary {
    method _notInlinedMessages (line 21) | _notInlinedMessages(_)

FILE: stocks/lib/main.dart
  function main (line 4) | void main()

FILE: stocks/lib/main_desktop.dart
  function main (line 5) | void main()

FILE: stocks/lib/stock.dart
  class _StocksLocalizationsDelegate (line 28) | class _StocksLocalizationsDelegate extends LocalizationsDelegate<StockSt...
    method load (line 30) | Future<StockStrings> load(Locale locale)
    method isSupported (line 33) | bool isSupported(Locale locale)
    method shouldReload (line 36) | bool shouldReload(_StocksLocalizationsDelegate old)
  class StocksApp (line 39) | class StocksApp extends StatefulWidget {
    method createState (line 41) | StocksAppState createState()
  class StocksAppState (line 44) | class StocksAppState extends State<StocksApp> {
    method initState (line 60) | void initState()
    method configurationUpdater (line 65) | void configurationUpdater(StockConfiguration value)
    method _getRoute (line 82) | Route<dynamic> _getRoute(RouteSettings settings)
    method build (line 107) | Widget build(BuildContext context)

FILE: stocks/lib/stock_arrow.dart
  class StockArrowPainter (line 9) | class StockArrowPainter extends CustomPainter {
    method paint (line 16) | void paint(Canvas canvas, Size size)
    method shouldRepaint (line 49) | bool shouldRepaint(StockArrowPainter oldDelegate)
  class StockArrow (line 55) | class StockArrow extends StatelessWidget {
    method _colorIndexForPercentChange (line 60) | int _colorIndexForPercentChange(double percentChange)
    method _colorForPercentChange (line 66) | Color _colorForPercentChange(double percentChange)
    method build (line 73) | Widget build(BuildContext context)

FILE: stocks/lib/stock_data.dart
  class Stock (line 18) | class Stock {
  class StockData (line 41) | class StockData extends ChangeNotifier {
    method add (line 58) | void add(List<dynamic> data)
    method _urlToFetch (line 71) | String _urlToFetch(int chunk)
    method _fetchNextChunk (line 79) | void _fetchNextChunk()
    method _end (line 97) | void _end()

FILE: stocks/lib/stock_home.dart
  type ModeUpdater (line 14) | typedef void ModeUpdater(StockMode mode);
  type _StockMenuItem (line 16) | enum _StockMenuItem { autorefresh, refresh, speedUp, speedDown }
  type StockHomeTab (line 17) | enum StockHomeTab { market, portfolio }
  class _NotImplementedDialog (line 19) | class _NotImplementedDialog extends StatelessWidget {
    method build (line 21) | Widget build(BuildContext context)
  class StockHome (line 52) | class StockHome extends StatefulWidget {
    method createState (line 60) | StockHomeState createState()
  class StockHomeState (line 63) | class StockHomeState extends State<StockHome> {
    method _handleSearchBegin (line 69) | void _handleSearchBegin()
    method _handleStockModeChange (line 83) | void _handleStockModeChange(StockMode value)
    method _handleStockMenu (line 88) | void _handleStockMenu(BuildContext context, _StockMenuItem value)
    method _buildDrawer (line 110) | Widget _buildDrawer(BuildContext context)
    method _handleShowSettings (line 180) | void _handleShowSettings()
    method _handleShowAbout (line 184) | void _handleShowAbout()
    method buildAppBar (line 188) | Widget buildAppBar()
    method _getStockList (line 230) | Iterable<Stock> _getStockList(StockData stocks, Iterable<String> symbols)
    method _filterBySearchQuery (line 235) | Iterable<Stock> _filterBySearchQuery(Iterable<Stock> stocks)
    method _buyStock (line 242) | void _buyStock(Stock stock)
    method _buildStockList (line 258) | Widget _buildStockList(BuildContext context, Iterable<Stock> stocks, S...
    method _buildStockTab (line 271) | Widget _buildStockTab(BuildContext context, StockHomeTab tab, List<Str...
    method buildSearchBar (line 283) | Widget buildSearchBar()
    method _handleCreateCompany (line 299) | void _handleCreateCompany()
    method buildFloatingActionButton (line 306) | Widget buildFloatingActionButton()
    method build (line 316) | Widget build(BuildContext context)
  class _CreateCompanySheet (line 335) | class _CreateCompanySheet extends StatelessWidget {
    method build (line 337) | Widget build(BuildContext context)

FILE: stocks/lib/stock_list.dart
  class StockList (line 10) | class StockList extends StatelessWidget {
    method build (line 19) | Widget build(BuildContext context)

FILE: stocks/lib/stock_row.dart
  type StockRowActionCallback (line 10) | typedef void StockRowActionCallback(Stock stock);
  class StockRow (line 12) | class StockRow extends StatelessWidget {
    method _getHandler (line 27) | GestureTapCallback _getHandler(StockRowActionCallback callback)
    method build (line 32) | Widget build(BuildContext context)

FILE: stocks/lib/stock_settings.dart
  class StockSettings (line 9) | class StockSettings extends StatefulWidget {
    method createState (line 16) | StockSettingsState createState()
  class StockSettingsState (line 19) | class StockSettingsState extends State<StockSettings> {
    method _handleOptimismChanged (line 20) | void _handleOptimismChanged(bool value)
    method _handleBackupChanged (line 25) | void _handleBackupChanged(bool value)
    method _handleShowGridChanged (line 29) | void _handleShowGridChanged(bool value)
    method _handleShowSizesChanged (line 33) | void _handleShowSizesChanged(bool value)
    method _handleShowBaselinesChanged (line 37) | void _handleShowBaselinesChanged(bool value)
    method _handleShowLayersChanged (line 41) | void _handleShowLayersChanged(bool value)
    method _handleShowPointersChanged (line 45) | void _handleShowPointersChanged(bool value)
    method _handleShowRainbowChanged (line 49) | void _handleShowRainbowChanged(bool value)
    method _handleShowPerformanceOverlayChanged (line 54) | void _handleShowPerformanceOverlayChanged(bool value)
    method _handleShowSemanticsDebuggerChanged (line 58) | void _handleShowSemanticsDebuggerChanged(bool value)
    method _confirmOptimismChange (line 62) | void _confirmOptimismChange()
    method sendUpdates (line 95) | void sendUpdates(StockConfiguration value)
    method buildAppBar (line 100) | Widget buildAppBar(BuildContext context)
    method buildSettingsPane (line 106) | Widget buildSettingsPane(BuildContext context)
    method build (line 212) | Widget build(BuildContext context)

FILE: stocks/lib/stock_strings.dart
  class StockStrings (line 15) | class StockStrings {
    method load (line 20) | Future<StockStrings> load(Locale locale)
    method of (line 27) | StockStrings of(BuildContext context)
    method title (line 31) | String title()
    method market (line 40) | String market()
    method portfolio (line 47) | String portfolio()

FILE: stocks/lib/stock_symbol_viewer.dart
  class _StockSymbolView (line 10) | class _StockSymbolView extends StatelessWidget {
    method build (line 17) | Widget build(BuildContext context)
  class StockSymbolPage (line 64) | class StockSymbolPage extends StatelessWidget {
    method build (line 71) | Widget build(BuildContext context)
  class StockSymbolBottomSheet (line 112) | class StockSymbolBottomSheet extends StatelessWidget {
    method build (line 118) | Widget build(BuildContext context)

FILE: stocks/lib/stock_types.dart
  type StockMode (line 7) | enum StockMode { optimistic, pessimistic }
  type BackupMode (line 8) | enum BackupMode { enabled, disabled }
  class StockConfiguration (line 10) | class StockConfiguration {
    method copyWith (line 44) | StockConfiguration copyWith({

FILE: text_demo/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: text_demo/lib/app.dart
  function main (line 6) | void main()
  class MyApp (line 8) | class MyApp extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)
  class MyStatefulWidget (line 25) | class MyStatefulWidget extends StatefulWidget {
    method createState (line 29) | _MyStatefulWidgetState createState()
  class _MyStatefulWidgetState (line 32) | class _MyStatefulWidgetState extends State<MyStatefulWidget> {
    method build (line 36) | Widget build(BuildContext context)

FILE: text_demo/lib/main.dart
  function main (line 5) | void main()

FILE: text_demo/lib/main_desktop.dart
  function main (line 7) | void main()

FILE: texture_tutorial/go-texture-example/gif/main.go
  type GifPlugin (line 17) | type GifPlugin struct
    method InitPlugin (line 27) | func (p *GifPlugin) InitPlugin(messenger plugin.BinaryMessenger) error {
    method InitPluginTexture (line 56) | func (p *GifPlugin) InitPluginTexture(registry *flutter.TextureRegistr...
    method textureHanler (line 86) | func (p *GifPlugin) textureHanler(width, height int) (bool, *flutter.P...
  function getGifDimensions (line 94) | func getGifDimensions(gif *gif.GIF) (x, y int) {

FILE: texture_tutorial/go-texture-example/image/main.go
  type ImagePlugin (line 15) | type ImagePlugin struct
    method InitPlugin (line 20) | func (p *ImagePlugin) InitPlugin(messenger plugin.BinaryMessenger) err...
    method InitPluginTexture (line 25) | func (p *ImagePlugin) InitPluginTexture(registry *flutter.TextureRegis...
    method textureHanler (line 51) | func (p *ImagePlugin) textureHanler(width, height int) (bool, *flutter...

FILE: texture_tutorial/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: texture_tutorial/lib/main_desktop.dart
  function main (line 5) | void main()
  class MyApp (line 10) | class MyApp extends StatelessWidget {
    method build (line 13) | Widget build(BuildContext context)

FILE: xbox_controller/go-plugin-example/controller/main.go
  type XBOXStream (line 13) | type XBOXStream struct
    method InitPlugin (line 19) | func (p *XBOXStream) InitPlugin(messenger plugin.BinaryMessenger) error {
    method OnListen (line 26) | func (p *XBOXStream) OnListen(arguments interface{}, sink *plugin.Even...
    method OnCancel (line 77) | func (p *XBOXStream) OnCancel(arguments interface{}) {

FILE: xbox_controller/go/cmd/import-path_provider-plugin.go
  function init (line 10) | func init() {

FILE: xbox_controller/go/cmd/main.go
  function main (line 18) | func main() {
  function iconProvider (line 31) | func iconProvider() ([]image.Image, error) {

FILE: xbox_controller/lib/game.dart
  class MyGame (line 12) | class MyGame extends BaseGame {
    method searchController (line 28) | void searchController()
    method _updateGameController (line 44) | void _updateGameController(ctrl)
    method _start (line 52) | void _start()
    method render (line 57) | void render(Canvas canvas)
  class Coordinates (line 94) | class Coordinates {
  class Button (line 99) | class Button {
  class Controller (line 106) | class Controller {
    method offsetRightStick (line 127) | Coordinates offsetRightStick()
    method offsetLeftStick (line 131) | Coordinates offsetLeftStick()
    method rt (line 135) | double rt()
    method lt (line 139) | double lt()
    method pressedButtons (line 143) | List<Button> pressedButtons()

FILE: xbox_controller/lib/main.dart
  function main (line 1) | void main()

FILE: xbox_controller/lib/main_desktop.dart
  function main (line 10) | void main()
Condensed preview — 150 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (279K chars).
[
  {
    "path": ".github/workflows/main.yml",
    "chars": 1222,
    "preview": "name: Github Actions\n\non:\n  schedule:\n    - cron: \"0 0 * * 1\"\n  push:\n    branches: [master]\n  pull_request:\n    branche"
  },
  {
    "path": ".gitignore",
    "chars": 42,
    "preview": ".idea\n*.iml\n.flutter-plugins-dependencies\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 1399,
    "preview": "stages:\n  - build\n\n# .hoverBuildPackaged is a template job that we re-use for a number of concrete\n# build jobs. This al"
  },
  {
    "path": "README.md",
    "chars": 929,
    "preview": "# go-flutter-desktop/examples\n\nThis repository contains some example applications that can be built using [go-flutter](h"
  },
  {
    "path": "draggable_borderless/.gitignore",
    "chars": 1446,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "draggable_borderless/.metadata",
    "chars": 303,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "draggable_borderless/README.md",
    "chars": 1486,
    "preview": "# draggable_borderless\n\nA [go-flutter-desktop](https://github.com/go-flutter-desktop/go-flutter/wiki/Plugin-info) GLFW p"
  },
  {
    "path": "draggable_borderless/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "draggable_borderless/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "draggable_borderless/go/cmd/options.go",
    "chars": 2657,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter/plugin\"\n\t\""
  },
  {
    "path": "draggable_borderless/go/go.mod",
    "chars": 433,
    "preview": "module draggable_borderless/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-gl/g"
  },
  {
    "path": "draggable_borderless/go/go.sum",
    "chars": 4376,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "draggable_borderless/go/hover.yaml",
    "chars": 661,
    "preview": "#application-name: \"draggable_borderless\" # Uncomment to modify this value.\n#executable-name: \"draggable_borderless\" # U"
  },
  {
    "path": "draggable_borderless/lib/main_desktop.dart",
    "chars": 2333,
    "preview": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.d"
  },
  {
    "path": "draggable_borderless/pubspec.yaml",
    "chars": 2665,
    "preview": "name: draggable_borderless\ndescription: A new Flutter project.\n\n# The following defines the version and build number for"
  },
  {
    "path": "keyboard_event/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "keyboard_event/README.md",
    "chars": 255,
    "preview": "# keyboard_event\n\nA [`RawKeyEvent`](https://api.flutter.dev/flutter/services/RawKeyEvent-class.html) go-flutter-desktop "
  },
  {
    "path": "keyboard_event/fonts/Roboto/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "keyboard_event/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "keyboard_event/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "keyboard_event/go/cmd/options.go",
    "chars": 149,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowIni"
  },
  {
    "path": "keyboard_event/go/go.mod",
    "chars": 439,
    "preview": "module keyboard_event/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0"
  },
  {
    "path": "keyboard_event/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "keyboard_event/go/hover.yaml",
    "chars": 643,
    "preview": "#application-name: \"keyboard_event\" # Uncomment to modify this value.\n#executable-name: \"keyboard_event\" # Uncomment to "
  },
  {
    "path": "keyboard_event/lib/app.dart",
    "chars": 2654,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\nimport 'package:flutter/services.dart';"
  },
  {
    "path": "keyboard_event/lib/main.dart",
    "chars": 119,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:keyboard_event/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "keyboard_event/lib/main_desktop.dart",
    "chars": 268,
    "preview": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.d"
  },
  {
    "path": "keyboard_event/pubspec.yaml",
    "chars": 1988,
    "preview": "name: keyboard_event\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your "
  },
  {
    "path": "plugin_tutorial/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "plugin_tutorial/README.md",
    "chars": 271,
    "preview": "# plugin_tutorial\n\nA detailed tutorial for developing plugins is available at: [go-flutter wiki](https://github.com/go-f"
  },
  {
    "path": "plugin_tutorial/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "plugin_tutorial/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "plugin_tutorial/go/cmd/options.go",
    "chars": 507,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/plugins/go-plugin-exa"
  },
  {
    "path": "plugin_tutorial/go/go.mod",
    "chars": 806,
    "preview": "module plugin_tutorial/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-d"
  },
  {
    "path": "plugin_tutorial/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "plugin_tutorial/go/hover.yaml",
    "chars": 646,
    "preview": "#application-name: \"plugin_tutorial\" # Uncomment to modify this value.\n#executable-name: \"plugin_tutorial\" # Uncomment t"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/go.mod",
    "chars": 492,
    "preview": "module github.com/go-flutter-desktop/plugins/go-plugin-example/battery\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/g"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/go.sum",
    "chars": 4147,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/battery/main.go",
    "chars": 2027,
    "preview": "package battery\n\nimport (\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/go-flutter"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/go.mod",
    "chars": 492,
    "preview": "module github.com/go-flutter-desktop/plugins/go-plugin-example/complex\n\ngo 1.19\n\nrequire github.com/go-flutter-desktop/g"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/go.sum",
    "chars": 4147,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "plugin_tutorial/go-plugin-example/complex/main.go",
    "chars": 2685,
    "preview": "package complex\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.c"
  },
  {
    "path": "plugin_tutorial/lib/main_desktop.dart",
    "chars": 3017,
    "preview": "import 'package:flutter/services.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_test/flutter_test"
  },
  {
    "path": "plugin_tutorial/pubspec.yaml",
    "chars": 1530,
    "preview": "name: plugin_tutorial\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your"
  },
  {
    "path": "pointer_demo/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "pointer_demo/README.md",
    "chars": 167,
    "preview": "# pointer_demo\n\nA new go-flutter-desktop example.\n\n\n## Demo\n<p align=\"center\">\n  <img src=\"./hover.gif\" width=\"650\" alig"
  },
  {
    "path": "pointer_demo/fonts/Roboto/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "pointer_demo/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "pointer_demo/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "pointer_demo/go/cmd/options.go",
    "chars": 149,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowIni"
  },
  {
    "path": "pointer_demo/go/go.mod",
    "chars": 437,
    "preview": "module pointer_demo/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9"
  },
  {
    "path": "pointer_demo/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "pointer_demo/go/hover.yaml",
    "chars": 637,
    "preview": "#application-name: \"pointer_demo\" # Uncomment to modify this value.\n#executable-name: \"pointer_demo\" # Uncomment to modi"
  },
  {
    "path": "pointer_demo/lib/app.dart",
    "chars": 3526,
    "preview": "// This example makes a [Container] react to being entered by a mouse\n// pointer, showing a count of the number of entri"
  },
  {
    "path": "pointer_demo/lib/main.dart",
    "chars": 117,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:pointer_demo/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "pointer_demo/lib/main_desktop.dart",
    "chars": 262,
    "preview": "import 'package:flutter/foundation.dart' show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.dart'"
  },
  {
    "path": "pointer_demo/pubspec.yaml",
    "chars": 1986,
    "preview": "name: pointer_demo\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your ap"
  },
  {
    "path": "renovate.json",
    "chars": 346,
    "preview": "{\n  \"extends\": [\"config:base\"],\n  \"automerge\": true,\n  \"major\": {\n    \"automerge\": false\n  },\n  \"gomodTidy\": true,\n  \"re"
  },
  {
    "path": "stocks/.gitignore",
    "chars": 47,
    "preview": ".DS_Store\n.dart_tool/\n\n.packages\n.pub/\n\nbuild/\n"
  },
  {
    "path": "stocks/README.md",
    "chars": 1902,
    "preview": "# Stocks\n\n[Example from the flutter repo](https://github.com/flutter/flutter/tree/master/examples/stocks)  \nDemo app for"
  },
  {
    "path": "stocks/fonts/Roboto/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "stocks/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "stocks/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "stocks/go/cmd/options.go",
    "chars": 149,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowIni"
  },
  {
    "path": "stocks/go/go.mod",
    "chars": 431,
    "preview": "module stocks/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n)\n\n"
  },
  {
    "path": "stocks/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "stocks/go/hover.yaml",
    "chars": 620,
    "preview": "#application-name: \"stocks\" # Uncomment to modify this value.\n#executable-name: \"stocks\" # Uncomment to modify this valu"
  },
  {
    "path": "stocks/go/packaging/darwin-bundle/{{.applicationName}} {{.version}}.app/Contents/Info.plist.tmpl",
    "chars": 1449,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
  },
  {
    "path": "stocks/go/packaging/darwin-pkg/flat/Distribution.tmpl",
    "chars": 548,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<installer-gui-script minSpecVersion=\"1\">\n\t<title>{{.applicationName}}</title>\n\t<"
  },
  {
    "path": "stocks/go/packaging/darwin-pkg/flat/base.pkg/PackageInfo.tmpl",
    "chars": 359,
    "preview": "<pkg-info format-version=\"2\" identifier=\"{{.organizationName}}.base.pkg\" version=\"{{.version}}\" install-location=\"/\" aut"
  },
  {
    "path": "stocks/go/packaging/linux-appimage/AppRun.tmpl",
    "chars": 64,
    "preview": "#!/bin/sh\ncd \"$(dirname \"$0\")\"\nexec ./build/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-appimage/{{.packageName}}.desktop.tmpl",
    "chars": 167,
    "preview": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName"
  },
  {
    "path": "stocks/go/packaging/linux-deb/DEBIAN/control.tmpl",
    "chars": 142,
    "preview": "Package: {{.packageName}}\nArchitecture: amd64\nMaintainer: @{{.author}}\nPriority: optional\nVersion: {{.version}}\nDescript"
  },
  {
    "path": "stocks/go/packaging/linux-deb/usr/bin/{{.executableName}}.tmpl",
    "chars": 56,
    "preview": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-deb/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "chars": 167,
    "preview": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/PKGBUILD.tmpl",
    "chars": 191,
    "preview": "pkgname={{.packageName}}\npkgver={{.version}}\npkgrel={{.release}}\npkgdesc=\"{{.description}}\"\narch=(\"x86_64\")\nlicense=('{{"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/src/usr/bin/{{.executableName}}.tmpl",
    "chars": 56,
    "preview": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-pkg/src/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "chars": 167,
    "preview": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/bin/{{.executableName}}.tmpl",
    "chars": 56,
    "preview": "#!/bin/sh\n/usr/lib/{{.packageName}}/{{.executableName}}\n"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/BUILDROOT/{{.packageName}}-{{.version}}-{{.release}}.x86_64/usr/share/applications/{{.executableName}}.desktop.tmpl",
    "chars": 167,
    "preview": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName"
  },
  {
    "path": "stocks/go/packaging/linux-rpm/SPECS/{{.packageName}}.spec.tmpl",
    "chars": 634,
    "preview": "Name: {{.packageName}}\nVersion: {{.version}}\nRelease: {{.release}}\nSummary: {{.description}}\nLicense: {{.license}}\n\n%des"
  },
  {
    "path": "stocks/go/packaging/linux-snap/snap/local/{{.executableName}}.desktop.tmpl",
    "chars": 167,
    "preview": "[Desktop Entry]\nVersion=1.0\nType=Application\nTerminal=false\nCategories=\nComment={{.description}}\nName={{.applicationName"
  },
  {
    "path": "stocks/go/packaging/linux-snap/snap/snapcraft.yaml.tmpl",
    "chars": 503,
    "preview": "name: {{.packageName}}\nbase: core18\nversion: '{{.version}}'\nsummary: {{.description}}\ndescription: |\n  {{.description}}\n"
  },
  {
    "path": "stocks/go/packaging/windows-msi/upgrade-code.txt",
    "chars": 139,
    "preview": "dd8de1ec-bfb9-4bd9-a59a-59e092dae8cb\n# This GUID is your upgrade code and ensures that you can properly update your app."
  },
  {
    "path": "stocks/go/packaging/windows-msi/{{.packageName}}.wxs.tmpl",
    "chars": 1985,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\n    <Product Id=\"*\" Upgrad"
  },
  {
    "path": "stocks/lib/i18n/.dartignore",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "stocks/lib/i18n/regenerate.md",
    "chars": 1432,
    "preview": "## Regenerating the i18n files\n\nThe files in this directory are based on ../lib/stock_strings.dart\nwhich defines all of "
  },
  {
    "path": "stocks/lib/i18n/stock_messages_all.dart",
    "chars": 1856,
    "preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that looks up messa"
  },
  {
    "path": "stocks/lib/i18n/stock_messages_en.dart",
    "chars": 938,
    "preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
  },
  {
    "path": "stocks/lib/i18n/stock_messages_es.dart",
    "chars": 939,
    "preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
  },
  {
    "path": "stocks/lib/i18n/stocks_en.arb",
    "chars": 419,
    "preview": "{\n  \"title\": \"Stocks\",\n  \"@title\": {\n    \"description\": \"Title for the Stocks application\",\n    \"type\": \"text\",\n    \"pla"
  },
  {
    "path": "stocks/lib/i18n/stocks_es.arb",
    "chars": 420,
    "preview": "{\n  \"title\": \"Acciones\",\n  \"@title\": {\n    \"description\": \"Title for the Stocks application\",\n    \"type\": \"text\",\n    \"p"
  },
  {
    "path": "stocks/lib/main.dart",
    "chars": 119,
    "preview": "import 'package:flutter/widgets.dart';\nimport 'package:stocks/stock.dart';\n\nvoid main() {\n  runApp(new StocksApp());\n}\n"
  },
  {
    "path": "stocks/lib/main_desktop.dart",
    "chars": 224,
    "preview": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:stocks/stock.dart';\n\nvo"
  },
  {
    "path": "stocks/lib/stock.dart",
    "chars": 4703,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_arrow.dart",
    "chars": 2694,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_data.dart",
    "chars": 2682,
    "preview": "// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_home.dart",
    "chars": 10902,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_list.dart",
    "chars": 998,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_row.dart",
    "chars": 2697,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_settings.dart",
    "chars": 7689,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_strings.dart",
    "chars": 1331,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_symbol_viewer.dart",
    "chars": 4053,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/lib/stock_types.dart",
    "chars": 2444,
    "preview": "// Copyright 2015 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "stocks/pubspec.yaml",
    "chars": 795,
    "preview": "name: stocks\ndescription: A simple stocks application\n\nenvironment:\n  # The pub client defaults to an <2.0.0 sdk constra"
  },
  {
    "path": "text_demo/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "text_demo/fonts/Roboto/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "text_demo/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "text_demo/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "text_demo/go/cmd/options.go",
    "chars": 149,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n)\n\nvar options = []flutter.Option{\n\tflutter.WindowIni"
  },
  {
    "path": "text_demo/go/go.mod",
    "chars": 528,
    "preview": "module text_demo/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/pkg/errors v0.9.1\n"
  },
  {
    "path": "text_demo/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "text_demo/go/hover.yaml",
    "chars": 628,
    "preview": "#application-name: \"text_demo\" # Uncomment to modify this value.\n#executable-name: \"text_demo\" # Uncomment to modify thi"
  },
  {
    "path": "text_demo/lib/app.dart",
    "chars": 2926,
    "preview": "// This example demos the TextField/SelectableText widget and keyboard\n// integration with the go-flutter text backend\n\n"
  },
  {
    "path": "text_demo/lib/main.dart",
    "chars": 114,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'package:text_demo/app.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n"
  },
  {
    "path": "text_demo/lib/main_desktop.dart",
    "chars": 263,
    "preview": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.d"
  },
  {
    "path": "text_demo/pubspec.yaml",
    "chars": 1983,
    "preview": "name: text_demo\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your appli"
  },
  {
    "path": "texture_tutorial/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "texture_tutorial/README.md",
    "chars": 479,
    "preview": "# texture_tutorial\n\nThe plugins source code is stored in the same example: [./go-texture-example](./go-texture-example)."
  },
  {
    "path": "texture_tutorial/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "texture_tutorial/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "texture_tutorial/go/cmd/options.go",
    "chars": 391,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flutter-desktop/plugins/go-texture-ex"
  },
  {
    "path": "texture_tutorial/go/go.mod",
    "chars": 827,
    "preview": "module texture_tutorial/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-"
  },
  {
    "path": "texture_tutorial/go/go.sum",
    "chars": 4254,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "texture_tutorial/go/hover.yaml",
    "chars": 649,
    "preview": "#application-name: \"texture_tutorial\" # Uncomment to modify this value.\n#executable-name: \"texture_tutorial\" # Uncomment"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/go.mod",
    "chars": 497,
    "preview": "module github.com/go-flutter-desktop/plugins/go-texture-example/example_gif\n\ngo 1.19\n\nrequire github.com/go-flutter-desk"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/go.sum",
    "chars": 4147,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "texture_tutorial/go-texture-example/gif/main.go",
    "chars": 3282,
    "preview": "package example_gif\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"image/draw\"\n\t\"image/gif\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/g"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/go.mod",
    "chars": 499,
    "preview": "module github.com/go-flutter-desktop/plugins/go-texture-example/example_image\n\ngo 1.19\n\nrequire github.com/go-flutter-de"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/go.sum",
    "chars": 4147,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "texture_tutorial/go-texture-example/image/main.go",
    "chars": 2190,
    "preview": "package example_image\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/draw\"\n\t\"os\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-"
  },
  {
    "path": "texture_tutorial/lib/main_desktop.dart",
    "chars": 2069,
    "preview": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\nimport 'package:flutter/material.d"
  },
  {
    "path": "texture_tutorial/pubspec.yaml",
    "chars": 1532,
    "preview": "name: texture_tutorial\ndescription: A new Flutter project.\n\n# The following defines the version and build number for you"
  },
  {
    "path": "xbox_controller/.gitignore",
    "chars": 1288,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": "xbox_controller/README.md",
    "chars": 382,
    "preview": "# xbox_controller\n\nA project demonstrating:\n  - The [EventChannel](https://godoc.org/github.com/go-flutter-desktop/go-fl"
  },
  {
    "path": "xbox_controller/fonts/Roboto/LICENSE.txt",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "xbox_controller/go/.gitignore",
    "chars": 51,
    "preview": "build\n.last_goflutter_check\n.last_go-flutter_check\n"
  },
  {
    "path": "xbox_controller/go/cmd/import-path_provider-plugin.go",
    "chars": 494,
    "preview": "package main\n\n// DO NOT EDIT, this file is generated by hover at compile-time for the path_provider plugin.\n\nimport (\n\tf"
  },
  {
    "path": "xbox_controller/go/cmd/main.go",
    "chars": 1173,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/go-flutter-desktop"
  },
  {
    "path": "xbox_controller/go/cmd/options.go",
    "chars": 309,
    "preview": "package main\n\nimport (\n\t\"github.com/go-flutter-desktop/go-flutter\"\n\tcontroller \"github.com/go-flutter-desktop/plugins/xb"
  },
  {
    "path": "xbox_controller/go/go.mod",
    "chars": 684,
    "preview": "module xbox_controller/go\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n\tgithub.com/go-flutter-d"
  },
  {
    "path": "xbox_controller/go/go.sum",
    "chars": 4843,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "xbox_controller/go/hover.yaml",
    "chars": 646,
    "preview": "#application-name: \"xbox_controller\" # Uncomment to modify this value.\n#executable-name: \"xbox_controller\" # Uncomment t"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/go.mod",
    "chars": 464,
    "preview": "module github.com/go-flutter-desktop/plugins/xbox\n\ngo 1.19\n\nrequire (\n\tgithub.com/go-flutter-desktop/go-flutter v0.52.2\n"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/go.sum",
    "chars": 4269,
    "preview": "github.com/Xuanwo/go-locale v1.1.0 h1:51gUxhxl66oXAjI9uPGb2O0qwPECpriKQb2hl35mQkg=\ngithub.com/Xuanwo/go-locale v1.1.0/go"
  },
  {
    "path": "xbox_controller/go-plugin-example/controller/main.go",
    "chars": 2078,
    "preview": "package controller\n\nimport (\n\t\"reflect\"\n\t\"time\"\n\n\tflutter \"github.com/go-flutter-desktop/go-flutter\"\n\t\"github.com/go-flu"
  },
  {
    "path": "xbox_controller/lib/game.dart",
    "chars": 4733,
    "preview": "import 'package:flame/game.dart';\nimport 'package:flame_svg/flame_svg.dart';\nimport 'package:flame/position.dart';\nimpor"
  },
  {
    "path": "xbox_controller/lib/main.dart",
    "chars": 59,
    "preview": "void main() async {\n  print(\"Desktop only application\");\n}\n"
  },
  {
    "path": "xbox_controller/lib/main_desktop.dart",
    "chars": 604,
    "preview": "import 'package:flutter/foundation.dart'\n    show debugDefaultTargetPlatformOverride;\n\nimport 'package:flutter/material."
  },
  {
    "path": "xbox_controller/pubspec.yaml",
    "chars": 2055,
    "preview": "name: xbox_controller\ndescription: A new Flutter project.\n\n# The following defines the version and build number for your"
  }
]

About this extraction

This page contains the full source code of the go-flutter-desktop/examples GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 150 files (255.0 KB), approximately 83.9k tokens, and a symbol index with 210 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!