@@ -0,0 +1,248 @@
|
||||
{
|
||||
"configVersion": 2,
|
||||
"packages": [
|
||||
{
|
||||
"name": "ansi_styles",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/ansi_styles-0.3.2+1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "args",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/args-2.4.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/async-2.11.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "boolean_selector",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "charcode",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/charcode-1.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "cli_launcher",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_launcher-0.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "cli_util",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_util-0.4.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "collection",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/collection-1.17.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "conventional_commit",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/conventional_commit-0.6.0+1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "file",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/file-6.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "glob",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/glob-2.1.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "graphs",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/graphs-2.3.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "http",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/http-0.13.6",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "http_parser",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/http_parser-4.0.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "io",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/io-1.0.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "json_annotation",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/json_annotation-4.8.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "matcher",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/matcher-0.12.16",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "melos",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/melos-3.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "meta",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/meta-1.9.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "mustache_template",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/mustache_template-2.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/path-1.8.3",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "platform",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/platform-3.1.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "pool",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/pool-1.5.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "process",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/process-4.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "prompts",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/prompts-2.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "pub_semver",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_semver-2.1.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "pub_updater",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_updater-0.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "pubspec",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/pubspec-2.3.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "quiver",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/quiver-3.2.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "source_span",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/source_span-1.10.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "stack_trace",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/stack_trace-1.11.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "stream_channel",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/stream_channel-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.14"
|
||||
},
|
||||
{
|
||||
"name": "string_scanner",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/string_scanner-1.2.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "term_glyph",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/term_glyph-1.2.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "test_api",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/test_api-0.6.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.18"
|
||||
},
|
||||
{
|
||||
"name": "typed_data",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/typed_data-1.3.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
},
|
||||
{
|
||||
"name": "uri",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/uri-1.0.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.12"
|
||||
},
|
||||
{
|
||||
"name": "yaml",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml-3.1.2",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "yaml_edit",
|
||||
"rootUri": "file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml_edit-2.1.1",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "fl_query_packages",
|
||||
"rootUri": "../",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.17"
|
||||
}
|
||||
],
|
||||
"generated": "2023-05-29T02:30:48.970388Z",
|
||||
"generator": "pub",
|
||||
"generatorVersion": "3.0.2"
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
ansi_styles
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/ansi_styles-0.3.2+1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/ansi_styles-0.3.2+1/lib/
|
||||
args
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/args-2.4.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/args-2.4.1/lib/
|
||||
async
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/async-2.11.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/async-2.11.0/lib/
|
||||
boolean_selector
|
||||
2.17
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib/
|
||||
charcode
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/charcode-1.3.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/charcode-1.3.1/lib/
|
||||
cli_launcher
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_launcher-0.3.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_launcher-0.3.1/lib/
|
||||
cli_util
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_util-0.4.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/cli_util-0.4.0/lib/
|
||||
collection
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/collection-1.17.2/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/collection-1.17.2/lib/
|
||||
conventional_commit
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/conventional_commit-0.6.0+1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/conventional_commit-0.6.0+1/lib/
|
||||
file
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/file-6.1.4/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/file-6.1.4/lib/
|
||||
glob
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/glob-2.1.2/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/glob-2.1.2/lib/
|
||||
graphs
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/graphs-2.3.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/graphs-2.3.1/lib/
|
||||
http
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/http-0.13.6/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/http-0.13.6/lib/
|
||||
http_parser
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/http_parser-4.0.2/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/http_parser-4.0.2/lib/
|
||||
io
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/io-1.0.4/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/io-1.0.4/lib/
|
||||
json_annotation
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/json_annotation-4.8.1/lib/
|
||||
matcher
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/matcher-0.12.16/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/matcher-0.12.16/lib/
|
||||
melos
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/melos-3.1.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/melos-3.1.0/lib/
|
||||
meta
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/meta-1.9.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/meta-1.9.1/lib/
|
||||
mustache_template
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/mustache_template-2.0.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/mustache_template-2.0.0/lib/
|
||||
path
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/path-1.8.3/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/path-1.8.3/lib/
|
||||
platform
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/platform-3.1.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/platform-3.1.0/lib/
|
||||
pool
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pool-1.5.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pool-1.5.1/lib/
|
||||
process
|
||||
2.14
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/process-4.2.4/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/process-4.2.4/lib/
|
||||
prompts
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/prompts-2.0.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/prompts-2.0.0/lib/
|
||||
pub_semver
|
||||
2.17
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_semver-2.1.4/lib/
|
||||
pub_updater
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_updater-0.2.4/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pub_updater-0.2.4/lib/
|
||||
pubspec
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pubspec-2.3.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/pubspec-2.3.0/lib/
|
||||
quiver
|
||||
2.17
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/quiver-3.2.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/quiver-3.2.1/lib/
|
||||
source_span
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/source_span-1.10.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib/
|
||||
stack_trace
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/stack_trace-1.11.0/lib/
|
||||
stream_channel
|
||||
2.14
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/stream_channel-2.1.1/lib/
|
||||
string_scanner
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib/
|
||||
term_glyph
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib/
|
||||
test_api
|
||||
2.18
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/test_api-0.6.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/test_api-0.6.0/lib/
|
||||
typed_data
|
||||
2.17
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/typed_data-1.3.2/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/typed_data-1.3.2/lib/
|
||||
uri
|
||||
2.12
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/uri-1.0.0/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/uri-1.0.0/lib/
|
||||
yaml
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml-3.1.2/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml-3.1.2/lib/
|
||||
yaml_edit
|
||||
2.19
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml_edit-2.1.1/
|
||||
file:///home/krtirtho/.pub-cache/hosted/pub.dev/yaml_edit-2.1.1/lib/
|
||||
fl_query_packages
|
||||
2.17
|
||||
file:///home/krtirtho/dev/fl-query/
|
||||
file:///home/krtirtho/dev/fl-query/lib/
|
||||
2
|
||||
@@ -0,0 +1 @@
|
||||
3.10.2
|
||||
@@ -0,0 +1,242 @@
|
||||
# Change Log
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## 2023-10-06
|
||||
|
||||
### Changes
|
||||
|
||||
---
|
||||
|
||||
Packages with breaking changes:
|
||||
|
||||
- There are no breaking changes in this release.
|
||||
|
||||
Packages with other changes:
|
||||
|
||||
- [`fl_query` - `v1.0.0-alpha.5`](#fl_query---v100-alpha5)
|
||||
- [`fl_query_devtools` - `v0.1.0-alpha.3`](#fl_query_devtools---v010-alpha3)
|
||||
- [`fl_query_hooks` - `v1.0.0-alpha.5`](#fl_query_hooks---v100-alpha5)
|
||||
- [`fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.4`](#fl_query_connectivity_plus_adapter---v010-alpha4)
|
||||
|
||||
Packages with dependency updates only:
|
||||
|
||||
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||
|
||||
- `fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.4`
|
||||
|
||||
---
|
||||
|
||||
#### `fl_query` - `v1.0.0-alpha.5`
|
||||
|
||||
- **FIX**(query): isLoading & isRefreshing not working as expected.
|
||||
- **FIX**(mutation): isMutating not working.
|
||||
- **FEAT**(infinite_query): add isLoadingNextPage & remove isLoadingPage.
|
||||
|
||||
#### `fl_query_devtools` - `v0.1.0-alpha.3`
|
||||
|
||||
- **FEAT**(infinite_query): add isLoadingNextPage & remove isLoadingPage.
|
||||
|
||||
#### `fl_query_hooks` - `v1.0.0-alpha.5`
|
||||
|
||||
- **FIX**(mutation): isMutating not working.
|
||||
|
||||
|
||||
## 2023-09-09
|
||||
|
||||
### Changes
|
||||
|
||||
---
|
||||
|
||||
Packages with breaking changes:
|
||||
|
||||
- There are no breaking changes in this release.
|
||||
|
||||
Packages with other changes:
|
||||
|
||||
- [`fl_query_hooks` - `v1.0.0-alpha.4+1`](#fl_query_hooks---v100-alpha41)
|
||||
|
||||
---
|
||||
|
||||
#### `fl_query_hooks` - `v1.0.0-alpha.4+1`
|
||||
|
||||
- **FIX**(fl_query_hooks): upgrade flutter_hooks version & dart sdk constrain.
|
||||
|
||||
|
||||
## 2023-09-09
|
||||
|
||||
### Changes
|
||||
|
||||
---
|
||||
|
||||
Packages with breaking changes:
|
||||
|
||||
- There are no breaking changes in this release.
|
||||
|
||||
Packages with other changes:
|
||||
|
||||
- [`fl_query` - `v1.0.0-alpha.4`](#fl_query---v100-alpha4)
|
||||
- [`fl_query_devtools` - `v0.1.0-alpha.2`](#fl_query_devtools---v010-alpha2)
|
||||
- [`fl_query_hooks` - `v1.0.0-alpha.4`](#fl_query_hooks---v100-alpha4)
|
||||
- [`fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.3`](#fl_query_connectivity_plus_adapter---v010-alpha3)
|
||||
|
||||
Packages with dependency updates only:
|
||||
|
||||
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||
|
||||
- `fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.3`
|
||||
|
||||
---
|
||||
|
||||
#### `fl_query` - `v1.0.0-alpha.4`
|
||||
|
||||
- **FIX**: mutation onSuccess doesn't refresh all pages of infinite queries.
|
||||
- **FIX**: no refreshing stale queries with error.
|
||||
|
||||
#### `fl_query_devtools` - `v0.1.0-alpha.2`
|
||||
|
||||
- **FIX**(devtools): no wrapping child inside SizedBox.shrink.
|
||||
|
||||
#### `fl_query_hooks` - `v1.0.0-alpha.4`
|
||||
|
||||
- **FIX**: mutation onSuccess doesn't refresh all pages of infinite queries.
|
||||
|
||||
|
||||
## 2023-06-28
|
||||
|
||||
### Changes
|
||||
|
||||
---
|
||||
|
||||
Packages with breaking changes:
|
||||
|
||||
- There are no breaking changes in this release.
|
||||
|
||||
Packages with other changes:
|
||||
|
||||
- [`fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.2`](#fl_query_connectivity_plus_adapter---v010-alpha2)
|
||||
|
||||
---
|
||||
|
||||
#### `fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.2`
|
||||
|
||||
- **FIX**(fl_query_connectivity_plus_adapter): lower the sdk constrains.
|
||||
|
||||
|
||||
## 2023-06-24
|
||||
|
||||
### Changes
|
||||
|
||||
---
|
||||
|
||||
Packages with breaking changes:
|
||||
|
||||
- There are no breaking changes in this release.
|
||||
|
||||
Packages with other changes:
|
||||
|
||||
- [`fl_query` - `v1.0.0-alpha.3`](#fl_query---v100-alpha3)
|
||||
- [`fl_query_hooks` - `v1.0.0-alpha.3`](#fl_query_hooks---v100-alpha3)
|
||||
- [`fl_query_devtools` - `v0.1.0-alpha.1`](#fl_query_devtools---v010-alpha1)
|
||||
- [`fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.1`](#fl_query_connectivity_plus_adapter---v010-alpha1)
|
||||
|
||||
Packages with dependency updates only:
|
||||
|
||||
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||
|
||||
- `fl_query_devtools` - `v0.1.0-alpha.1`
|
||||
- `fl_query_connectivity_plus_adapter` - `v0.1.0-alpha.1`
|
||||
|
||||
---
|
||||
|
||||
#### `fl_query` - `v1.0.0-alpha.3`
|
||||
|
||||
- **REFACTOR**: directory restructure revamp.
|
||||
- **REFACTOR**: more convenient ways customizing config.
|
||||
- **REFACTOR**: stale logic to separate mixin.
|
||||
- **REFACTOR**: remove KyeType and use String for queryKey and mutationKey.
|
||||
- **REFACTOR**(example): package specific examples instead of a single example.
|
||||
- **REFACTOR**(QueryBowl): query bowl logic as a separate class instead of a stateful widget.
|
||||
- **REFACTOR**: move devtools to separate library.
|
||||
- **FIX**(fl_query_hooks): unneeded empty instances of query/mutation.
|
||||
- **FIX**(base_query): onData callback getting called with null #17.
|
||||
- **FIX**(fl_query_hooks): newest query/mutation/infinite-query instance not getting returned.
|
||||
- **FIX**: fetch query and infinite query resolving immediately without proper result.
|
||||
- **FIX**: refetchOnExternalDataChange isn't working #18.
|
||||
- **FIX**: mutation context param clashing with BuildContext.
|
||||
- **FIX**: query, infinite_query fetching/refetching when offline.
|
||||
- **FIX**: state update on unmounted hook and infinite query cache refetch not working.
|
||||
- **FIX**(client): check for error out put in fetch query and infinite query and mutateMutation immediate resolve.
|
||||
- **FIX**: not updating queryFn on create query's old query and checking stale status after updating queryFn instead of storing the status before.
|
||||
- **FIX**(InfiniteQueryJob): remove unneeded `keepPreviousData` property.
|
||||
- **FEAT**: add mutation and mutation builder with example.
|
||||
- **FEAT**: infinite query listenable add and cache event stream.
|
||||
- **FEAT**: add infinite query builder with example.
|
||||
- **FEAT**: new widget query listable builder.
|
||||
- **FEAT**: safe setState for builders, separate cache box for query and infinite query and update state before _operate to indicate loading state.
|
||||
- **FEAT**: working query builder, remove timeout from retryConfig.
|
||||
- **FEAT**: cache, client, query builder add and refreshOnQueryFnChange option.
|
||||
- **FEAT**: infinite query implementation.
|
||||
- **FEAT**: safe cancellation of running operation on reset.
|
||||
- **FEAT**: initial query and retryer implementation.
|
||||
- **FEAT**: clean old junk.
|
||||
- **FEAT**: useQuery hook with working example.
|
||||
- **FEAT**: useInfiniteQuery hook add.
|
||||
- **FEAT**: add query and infinite query disk caching support.
|
||||
- **FEAT**: use function hooks instead of class hooks.
|
||||
- **FEAT**: new next_page signature, query/mutation fn in notifier and safe update in use_updater.
|
||||
- **FEAT**(QueryClientProvider): add config parameters and override-able client parameter.
|
||||
- **FEAT**: add devtools (WIP).
|
||||
- **FEAT**: add ability to get, refresh query and infinite queries using prefix.
|
||||
- **FEAT**: connectivity adapter package for connectivity_plus.
|
||||
- **FEAT**: refresh on network state change and cancel retry when offline.
|
||||
- **FEAT**: add support for keepPreviousData & examples regarding this.
|
||||
- **FEAT**: resolve and resolveWith helper support.
|
||||
- **FEAT**: add initial support for `InfiniteQuery`.
|
||||
- **FEAT**(infinite-query): onData and onError listener support.
|
||||
- **FEAT**(infinite-query): add `useInfiniteQuery` hook with example.
|
||||
- **FEAT**(infinite-query): add setInfiniteQueryData support.
|
||||
- **FEAT**(infinite-query): add refetchPages, refetchOnStale, refetchOnMount support.
|
||||
- **FEAT**(infinite-query): add all the features of query in infinite query.
|
||||
- **FEAT**: implement refetchOnApplicationResume and refetchOnWindowFocus.
|
||||
- **DOCS**: add dynamic query & mutation section.
|
||||
- **DOCS**: add paginated-query section and update optimistc update section.
|
||||
- **DOCS**: update according to the new query bowl refactor.
|
||||
- **DOCS**: Front page Images added.
|
||||
- **DOCS**: add infinite query page.
|
||||
|
||||
#### `fl_query_hooks` - `v1.0.0-alpha.3`
|
||||
|
||||
- **REFACTOR**: move devtools to separate library.
|
||||
- **REFACTOR**: more convenient ways customizing config.
|
||||
- **REFACTOR**(QueryBowl): query bowl logic as a separate class instead of a stateful widget.
|
||||
- **REFACTOR**(example): package specific examples instead of a single example.
|
||||
- **FIX**(fl_query_hooks): fetch query when queryKey changes.
|
||||
- **FIX**(fl_query_hooks): query/mutation reset to initial memoized values on hot reload.
|
||||
- **FIX**: state update on unmounted hook and infinite query cache refetch not working.
|
||||
- **FIX**: refetchOnExternalDataChange isn't working #18.
|
||||
- **FIX**(base_query): onData callback getting called with null #17.
|
||||
- **FIX**(fl_query_hooks): unneeded empty instances of query/mutation.
|
||||
- **FIX**(fl_query_hooks): newest query/mutation/infinite-query instance not getting returned.
|
||||
- **FEAT**: connectivity adapter package for connectivity_plus.
|
||||
- **FEAT**: add devtools (WIP).
|
||||
- **FEAT**: new next_page signature, query/mutation fn in notifier and safe update in use_updater.
|
||||
- **FEAT**: use function hooks instead of class hooks.
|
||||
- **FEAT**: use mutation hook add.
|
||||
- **FEAT**: useInfiniteQuery hook add.
|
||||
- **FEAT**: useQuery hook with working example.
|
||||
- **FEAT**: safe cancellation of running operation on reset.
|
||||
- **FEAT**: add infinite query builder with example.
|
||||
- **FEAT**: cache, client, query builder add and refreshOnQueryFnChange option.
|
||||
- **FEAT**: initial query and retryer implementation.
|
||||
- **FEAT**: clean old junk.
|
||||
- **FEAT**: add query and infinite query disk caching support.
|
||||
- **FEAT**(infinite-query): onData and onError listener support.
|
||||
- **FEAT**(infinite-query): add `useInfiniteQuery` hook with example.
|
||||
- **FEAT**(infinite-query): add refetchPages, refetchOnStale, refetchOnMount support.
|
||||
- **FEAT**: add initial support for `InfiniteQuery`.
|
||||
- **FEAT**: add support for keepPreviousData & examples regarding this.
|
||||
- **DOCS**: add infinite query page.
|
||||
- **DOCS**: add paginated-query section and update optimistc update section.
|
||||
|
||||
@@ -16,7 +16,8 @@ Fl-Query makes asynchronous server state management a breeze in flutter
|
||||
- Smart + effective refetching
|
||||
- Optimistic updates
|
||||
- Automatically cached data invalidation & unneeded query/mutation garbage collection
|
||||
- Infinite data pagination via `InfiniteQuery`
|
||||
- Infinite pagination via `InfiniteQuery`
|
||||
- Lazy persistent cache (Uses [hive](https://pub.dev/packages/hive) for persisting query results to disk) (optional)
|
||||
- Easy to write & understand code. Follows DRY (Don't repeat yourself) convention
|
||||
- Compatible with both vanilla Flutter & elite [flutter_hooks](https://pub.dev/packages/flutter_hooks)
|
||||
|
||||
@@ -28,25 +29,34 @@ Regular installation:
|
||||
$ flutter pub add fl_query
|
||||
```
|
||||
|
||||
For elite flutter_hooks user:
|
||||
For elite flutter_hooks user (Welcome to the flutter cool community btw😎)
|
||||
|
||||
```bash
|
||||
$ flutter pub add flutter_hooks
|
||||
$ flutter pub add fl_query_hooks
|
||||
$ flutter pub add flutter_hooks fl_query_hooks
|
||||
```
|
||||
|
||||
# Docs
|
||||
|
||||
You can find the documentation (WIP) of fl-query at https://fl-query.krtirtho.dev/
|
||||
You can find the documentation of fl-query at https://fl-query.vercel.app/
|
||||
|
||||
# Basic Usage
|
||||
|
||||
First wrap your `MaterialApp` with with `QueryBowlScope` widget
|
||||
Initialize the cache databases in your `main` method
|
||||
|
||||
> fl-query uses [hive](https://pub.dev/packages/hive) for persisting data to disk
|
||||
|
||||
```dart
|
||||
void main()async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await QueryClient.initialize(cachePrefix: 'fl_query_example');
|
||||
runApp(MyApp());
|
||||
}
|
||||
```
|
||||
In `MyApp` Widget's build method wrap your `MaterialApp` with with `QueryClientProvider` widget
|
||||
|
||||
```dart
|
||||
Widget build(BuildContext context) {
|
||||
return QueryBowlScope(
|
||||
bowl: QueryBowl(),
|
||||
return QueryClientProvider(
|
||||
child: MaterialApp(
|
||||
title: 'Fl-Query Example App',
|
||||
theme: ThemeData(
|
||||
@@ -59,104 +69,116 @@ First wrap your `MaterialApp` with with `QueryBowlScope` widget
|
||||
}
|
||||
```
|
||||
|
||||
Fl-Query has two types of jobs
|
||||
- `QueryJob`: Used for storing GET requests or for storing changeable yet readonly async data
|
||||
- `MutationJob`: Used for POST/PUT/DELETE requests or for mutating/changing data in services or a store asynchronously
|
||||
Let's write use a `Query` now
|
||||
FL-Query provides a `QueryBuilder` widget that creates and listens to the specified `Query`
|
||||
and re-runs the builder function whenever there's an update
|
||||
|
||||
You can write all your query or mutation logic a method parameter named `task` & identify the query uniquely by passing a unique `queryKey`
|
||||
|
||||
Example of a QueryJob:
|
||||
It has 2 required parameters(unnamed) `key` & `builder`
|
||||
|
||||
```dart
|
||||
final exampleQueryJob = QueryJob<Map, void>(
|
||||
queryKey: "example", // have to be unique
|
||||
task: (queryKey, externalData) async {
|
||||
final res = await http.get("/api/example-data");
|
||||
return jsonDecode(res.body);
|
||||
}
|
||||
);
|
||||
```
|
||||
class MyApp extends StatelessWidget{
|
||||
MyApp({super.key});
|
||||
|
||||
Store the `QueryJob` somewhere globally accessible in your project so you can reuse it later
|
||||
|
||||
Now you can use this `QueryJob` anywhere inside your flutter app inside the build method using a `QueryBuilder` widget
|
||||
|
||||
```dart
|
||||
Widget build(BuildContext context){
|
||||
return QueryBuilder<String, void>(
|
||||
job: exampleQueryJob,
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
if (!query.hasData || query.isLoading) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text(query.data!),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
// refetches the query
|
||||
await query.refetch();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
Or if you're an elite **flutter_hooks** user you can use the `useQuery` hook which is exported from the `package:fl_query_hooks/fl_query_hooks.dart` to do the same thing as above
|
||||
|
||||
```dart
|
||||
/* other imports */
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:fl_query_hooks/fl_query_hooks.dart'; // importing the fl-query hook package
|
||||
|
||||
class Example extends HookWidget{
|
||||
Example(super.key);
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
final query = useQuery(job: exampleQueryJob, externalData: null);
|
||||
|
||||
if (!query.hasData || query.isLoading) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text(query.data!),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
// refetches the query
|
||||
await query.refetch();
|
||||
},
|
||||
@override
|
||||
build(context){
|
||||
return QueryBuilder<String, dynamic>(
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6), () => 'Hello World!');
|
||||
},
|
||||
initial: 'A replacement',
|
||||
jsonConfig: JsonConfig(
|
||||
fromJson: (json) => json['data'],
|
||||
toJson: (data) => {'data': data},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('onError: $error');
|
||||
},
|
||||
builder: (context, query) {
|
||||
if (query.isLoading) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (query.hasError) {
|
||||
return Center(
|
||||
child: Text(query.error.toString()),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Text(query.data ?? "Unfortunately, there's no data"),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And if you're using **flutter_hooks** you got that too
|
||||
|
||||
```dart
|
||||
class MyApp extends HookWidget{
|
||||
MyApp({super.key});
|
||||
|
||||
@override
|
||||
build(context){
|
||||
final query = useQuery<String, dynamic>(
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6), () => 'Hello World!');
|
||||
},
|
||||
initial: 'A replacement',
|
||||
jsonConfig: JsonConfig(
|
||||
fromJson: (json) => json['data'],
|
||||
toJson: (data) => {'data': data},
|
||||
),
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('onError: $error');
|
||||
},
|
||||
);
|
||||
|
||||
if (query.isLoading) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (query.hasError) {
|
||||
return Center(
|
||||
child: Text(query.error.toString()),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Text(query.data ?? "Unfortunately, there's no data"),
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
*To master the fl-query follow the official blog at https://fl-query.vercel.app/blog*
|
||||
|
||||
# Why?
|
||||
<p align="center">
|
||||
<img src="https://media.giphy.com/media/1M9fmo1WAFVK0/giphy.gif" alt="The hell, why?">
|
||||
</p>
|
||||
|
||||
The main purpose of Fl-Query is providing the easiest way to manage the messy server-state part requiring the least amount of code with code reusability & performance
|
||||
This let's you focus more on those cool UI animations & transitions✨. Leave the boring stuff to fl-query
|
||||
|
||||
**Isn't `FutureBuilder` good?**
|
||||
Yes but it is only if your commercial server has huge load of power & you're made of money or your app is simple or mostly offline & barely requires internet connection
|
||||
`FutureBuilder` isn't good for data persistency & its impossible to share data across the entire application using it
|
||||
**Q. Isn't `FutureBuilder` good?**
|
||||
|
||||
**So `FutureProvider` from riverpod or provider not enough?**
|
||||
Yeah, indeed its more than enough for many applications but what if your app needs Optimistic Updates & proper server-state synchronization or simply want a custom `cacheTime`? Although `FutureProvider` is a viable solution most of the `Future` related stuff, why not kick it up a notch with smart refetching capabilities with proper server-state synchronization?
|
||||
Riverpod is definitely a inspiration for Fl-Query & the `QueryJob` is actually inspired by riverpod & imo is the best state management solution any library has ever provided but that's still a client state manager just like other client state manager or synchronous data manager
|
||||
No, of course not. Unless you're from 2013 or your app is a purely offline app
|
||||
|
||||
**Q. So `FutureProvider` from riverpod or provider not enough?**
|
||||
|
||||
Probably yes. Although riverpod@v2 has added a lot of caching related features but still optimistic updates, periodic refetching & disk persistence are missing. Let's not forget about infinite pagination, it's a nightmare😅. In case of provider, same story. It's a great package but it's not ideal for server-state management
|
||||
|
||||
# Notice Board
|
||||
|
||||
This project is currently under heavy development & not yet production ready. There are lot of features to cover. If anyone encounters any unintended behavior or any bug please report it. Also we're open to improvement suggestions & feature requests
|
||||
|
||||
**Important!:** The project needs Dart-Flutter developers who are willing to contribute to the project by writing Tests. (I'm the worst example for tester)
|
||||
We need some bada** coders to write tests and ruin our life🥲
|
||||
100% coverage is our goal🙃
|
||||
@@ -1,12 +1,6 @@
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
connectivity_plus=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/
|
||||
connectivity_plus_linux=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/
|
||||
connectivity_plus_macos=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/
|
||||
connectivity_plus_web=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/
|
||||
connectivity_plus_windows=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/
|
||||
path_provider=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.11/
|
||||
path_provider_android=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.22/
|
||||
path_provider_ios=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.11/
|
||||
path_provider_linux=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/
|
||||
path_provider_macos=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/
|
||||
path_provider_windows=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/
|
||||
path_provider=/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider-2.0.15/
|
||||
path_provider_android=/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/
|
||||
path_provider_foundation=/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/
|
||||
path_provider_linux=/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/
|
||||
path_provider_windows=/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_ios","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.11/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.22/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.6/","native_build":true,"dependencies":[]},{"name":"path_provider_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"connectivity_plus_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/","native_build":false,"dependencies":[]}],"web":[{"name":"connectivity_plus_web","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-12-15 14:11:20.974968","version":"3.3.8"}
|
||||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_android-2.0.27/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_foundation","path":"/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_foundation-2.2.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_linux-2.1.11/","native_build":false,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dev/path_provider_windows-2.1.6/","native_build":false,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2023-06-23 22:55:18.872475","version":"3.10.2"}
|
||||
@@ -1,7 +1,112 @@
|
||||
## 1.0.0-alpha.5
|
||||
|
||||
- **FIX**(query): isLoading & isRefreshing not working as expected.
|
||||
- **FIX**(mutation): isMutating not working.
|
||||
- **FEAT**(infinite_query): add isLoadingNextPage & remove isLoadingPage.
|
||||
|
||||
## 1.0.0-alpha.4
|
||||
|
||||
- **FIX**: mutation onSuccess doesn't refresh all pages of infinite queries.
|
||||
- **FIX**: no refreshing stale queries with error.
|
||||
|
||||
## 1.0.0-alpha.3
|
||||
|
||||
- **REFACTOR**: directory restructure revamp.
|
||||
- **REFACTOR**: more convenient ways customizing config.
|
||||
- **REFACTOR**: stale logic to separate mixin.
|
||||
- **REFACTOR**: remove KyeType and use String for queryKey and mutationKey.
|
||||
- **REFACTOR**(example): package specific examples instead of a single example.
|
||||
- **REFACTOR**(QueryBowl): query bowl logic as a separate class instead of a stateful widget.
|
||||
- **REFACTOR**: move devtools to separate library.
|
||||
- **FIX**(fl_query_hooks): unneeded empty instances of query/mutation.
|
||||
- **FIX**(base_query): onData callback getting called with null #17.
|
||||
- **FIX**(fl_query_hooks): newest query/mutation/infinite-query instance not getting returned.
|
||||
- **FIX**: fetch query and infinite query resolving immediately without proper result.
|
||||
- **FIX**: refetchOnExternalDataChange isn't working #18.
|
||||
- **FIX**: mutation context param clashing with BuildContext.
|
||||
- **FIX**: query, infinite_query fetching/refetching when offline.
|
||||
- **FIX**: state update on unmounted hook and infinite query cache refetch not working.
|
||||
- **FIX**(client): check for error out put in fetch query and infinite query and mutateMutation immediate resolve.
|
||||
- **FIX**: not updating queryFn on create query's old query and checking stale status after updating queryFn instead of storing the status before.
|
||||
- **FIX**(InfiniteQueryJob): remove unneeded `keepPreviousData` property.
|
||||
- **FEAT**: add mutation and mutation builder with example.
|
||||
- **FEAT**: infinite query listenable add and cache event stream.
|
||||
- **FEAT**: add infinite query builder with example.
|
||||
- **FEAT**: new widget query listable builder.
|
||||
- **FEAT**: safe setState for builders, separate cache box for query and infinite query and update state before _operate to indicate loading state.
|
||||
- **FEAT**: working query builder, remove timeout from retryConfig.
|
||||
- **FEAT**: cache, client, query builder add and refreshOnQueryFnChange option.
|
||||
- **FEAT**: infinite query implementation.
|
||||
- **FEAT**: safe cancellation of running operation on reset.
|
||||
- **FEAT**: initial query and retryer implementation.
|
||||
- **FEAT**: clean old junk.
|
||||
- **FEAT**: useQuery hook with working example.
|
||||
- **FEAT**: useInfiniteQuery hook add.
|
||||
- **FEAT**: add query and infinite query disk caching support.
|
||||
- **FEAT**: use function hooks instead of class hooks.
|
||||
- **FEAT**: new next_page signature, query/mutation fn in notifier and safe update in use_updater.
|
||||
- **FEAT**(QueryClientProvider): add config parameters and override-able client parameter.
|
||||
- **FEAT**: add devtools (WIP).
|
||||
- **FEAT**: add ability to get, refresh query and infinite queries using prefix.
|
||||
- **FEAT**: connectivity adapter package for connectivity_plus.
|
||||
- **FEAT**: refresh on network state change and cancel retry when offline.
|
||||
- **FEAT**: add support for keepPreviousData & examples regarding this.
|
||||
- **FEAT**: resolve and resolveWith helper support.
|
||||
- **FEAT**: add initial support for `InfiniteQuery`.
|
||||
- **FEAT**(infinite-query): onData and onError listener support.
|
||||
- **FEAT**(infinite-query): add `useInfiniteQuery` hook with example.
|
||||
- **FEAT**(infinite-query): add setInfiniteQueryData support.
|
||||
- **FEAT**(infinite-query): add refetchPages, refetchOnStale, refetchOnMount support.
|
||||
- **FEAT**(infinite-query): add all the features of query in infinite query.
|
||||
- **FEAT**: implement refetchOnApplicationResume and refetchOnWindowFocus.
|
||||
- **DOCS**: add dynamic query & mutation section.
|
||||
- **DOCS**: add paginated-query section and update optimistc update section.
|
||||
- **DOCS**: update according to the new query bowl refactor.
|
||||
- **DOCS**: Front page Images added.
|
||||
- **DOCS**: add infinite query page.
|
||||
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
## [1.0.0-alpha.2](https://github.com/KRTirtho/fl-query/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2023-03-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **QueryClientProvider:** add config parameters and override-able client parameter ([f8895e3](https://github.com/KRTirtho/fl-query/commit/f8895e338141488e5bce4401c80b491688932085))
|
||||
|
||||
### [1.0.0-alpha.1](https://github.com/KRTirtho/fl-query/compare/v0.3.0...v1.0.0-alpha.1) (2023-03-05)
|
||||
|
||||
> **BREAKING**
|
||||
> - The Jobs API has been disabled. So there's no `QueryJob`, `MutationJob` and `InfiniteQueryJob` anymore. Instead, you can use the `QueryBuilder`, `MutationBuilder` and `InfiniteQueryBuilder` directly
|
||||
> - Some of classes were renamed to more mature names
|
||||
> - `QueryBowlProvider` -> `QueryClientProvider`
|
||||
> - `QueryBowl` -> `QueryClient`
|
||||
> - The unnecessary `getPreviousPageParam` is now removed from `InfiniteQuery`
|
||||
> - `getNextPageParam` has been renamed to `nextPage`
|
||||
> - Also, `fetchNextPage` has been renamed to `fetchNext`
|
||||
> - `Query` and `InfiniteQuery`'s `setQueryData` has been renamed to `setData` and it now accepts data directly instead of a call back function
|
||||
> - Finally, `QueryClient`'s unneeded `prefetchQuery` method was eradicated
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add infinite query builder ([efa2c81](https://github.com/KRTirtho/fl-query/commit/efa2c81505385eba0ba45f50c0debb9e4708804b))
|
||||
* add mutation and mutation builder ([6a90f84](https://github.com/KRTirtho/fl-query/commit/6a90f847c90c242ec089ab85f9ec7201a9aacd06))
|
||||
* add query and infinite query disk caching support ([074175e](https://github.com/KRTirtho/fl-query/commit/074175ed392370d5165d0573977af8d83422ac31))
|
||||
* add Cache, Client, QueryBuilder widget and refreshOnQueryFnChange support for queries ([18584a3](https://github.com/KRTirtho/fl-query/commit/18584a3c57dbb1538fc18a48b41be11fbc11d094))
|
||||
* InfiniteQuery implementation ([45b6f92](https://github.com/KRTirtho/fl-query/commit/45b6f92316ca1496e47462eb67aea64f43f8d9c1))
|
||||
* add InfiniteQueryListenable widget and cache event stream ([783a273](https://github.com/KRTirtho/fl-query/commit/783a2737b18283478d65082e236629188c124e6b))
|
||||
* add Query and Retryer ([b304466](https://github.com/KRTirtho/fl-query/commit/b304466d73654a89c9582b8211b063ae8c661454))
|
||||
* infinite query's nextPage method ([f2a23b0](https://github.com/KRTirtho/fl-query/commit/f2a23b085cd657a1612d87749f6592b4d67814c5))
|
||||
* new QueryListableBuilder widget ([975f9ea](https://github.com/KRTirtho/fl-query/commit/975f9eafe14d2ae235a67c173622f16ef850e8e7))
|
||||
* safe cancellation of running operation on reset ([5dde200](https://github.com/KRTirtho/fl-query/commit/5dde200c84836aba676708c2dd2682a861edb289))
|
||||
* safe setState for builders, separate cache box for query and infinite query ([68e60c1](https://github.com/KRTirtho/fl-query/commit/68e60c1914d321bb8e23516966bafc990ea2bc31))
|
||||
* add usMutation hook ([383d0e0](https://github.com/KRTirtho/fl-query/commit/383d0e0a85d7db6ee30bc336cb849f4ea401a8f1))
|
||||
* add useInfiniteQuery hook ([f9a5207](https://github.com/KRTirtho/fl-query/commit/f9a520740321ababa3974e232562b32364062a35))
|
||||
* add useQuery hook ([7fabf44](https://github.com/KRTirtho/fl-query/commit/7fabf44756ed36aaa4481583167735bc18f97ad1))
|
||||
|
||||
|
||||
### [0.3.1](https://github.com/KRTirtho/fl-query/compare/v0.3.0...v0.3.1) (2022-10-03)
|
||||
|
||||
|
||||
@@ -16,7 +16,8 @@ Fl-Query makes asynchronous server state management a breeze in flutter
|
||||
- Smart + effective refetching
|
||||
- Optimistic updates
|
||||
- Automatically cached data invalidation & unneeded query/mutation garbage collection
|
||||
- Infinite data pagination via `InfiniteQuery`
|
||||
- Infinite pagination via `InfiniteQuery`
|
||||
- Lazy persistent cache (Uses [hive](https://pub.dev/packages/hive) for persisting query results to disk) (optional)
|
||||
- Easy to write & understand code. Follows DRY (Don't repeat yourself) convention
|
||||
- Compatible with both vanilla Flutter & elite [flutter_hooks](https://pub.dev/packages/flutter_hooks)
|
||||
|
||||
@@ -28,25 +29,34 @@ Regular installation:
|
||||
$ flutter pub add fl_query
|
||||
```
|
||||
|
||||
For elite flutter_hooks user:
|
||||
For elite flutter_hooks user (Welcome to the flutter cool community btw😎)
|
||||
|
||||
```bash
|
||||
$ flutter pub add flutter_hooks
|
||||
$ flutter pub add fl_query_hooks
|
||||
$ flutter pub add flutter_hooks fl_query_hooks
|
||||
```
|
||||
|
||||
# Docs
|
||||
|
||||
You can find the documentation (WIP) of fl-query at https://fl-query.vercel.app/
|
||||
You can find the documentation of fl-query at https://fl-query.vercel.app/
|
||||
|
||||
# Basic Usage
|
||||
|
||||
First wrap your `MaterialApp` with with `QueryBowlScope` widget
|
||||
Initialize the cache databases in your `main` method
|
||||
|
||||
> fl-query uses [hive](https://pub.dev/packages/hive) for persisting data to disk
|
||||
|
||||
```dart
|
||||
void main()async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await QueryClient.initialize(cachePrefix: 'fl_query_example');
|
||||
runApp(MyApp());
|
||||
}
|
||||
```
|
||||
In `MyApp` Widget's build method wrap your `MaterialApp` with with `QueryClientProvider` widget
|
||||
|
||||
```dart
|
||||
Widget build(BuildContext context) {
|
||||
return QueryBowlScope(
|
||||
bowl: QueryBowl(),
|
||||
return QueryClientProvider(
|
||||
child: MaterialApp(
|
||||
title: 'Fl-Query Example App',
|
||||
theme: ThemeData(
|
||||
@@ -59,104 +69,116 @@ First wrap your `MaterialApp` with with `QueryBowlScope` widget
|
||||
}
|
||||
```
|
||||
|
||||
Fl-Query has two types of jobs
|
||||
- `QueryJob`: Used for storing GET requests or for storing changeable yet readonly async data
|
||||
- `MutationJob`: Used for POST/PUT/DELETE requests or for mutating/changing data in services or a store asynchronously
|
||||
Let's write use a `Query` now
|
||||
FL-Query provides a `QueryBuilder` widget that creates and listens to the specified `Query`
|
||||
and re-runs the builder function whenever there's an update
|
||||
|
||||
You can write all your query or mutation logic a method parameter named `task` & identify the query uniquely by passing a unique `queryKey`
|
||||
|
||||
Example of a QueryJob:
|
||||
It has 2 required parameters(unnamed) `key` & `builder`
|
||||
|
||||
```dart
|
||||
final exampleQueryJob = QueryJob<Map, void>(
|
||||
queryKey: "example", // have to be unique
|
||||
task: (queryKey, externalData) async {
|
||||
final res = await http.get("/api/example-data");
|
||||
return jsonDecode(res.body);
|
||||
}
|
||||
);
|
||||
```
|
||||
class MyApp extends StatelessWidget{
|
||||
MyApp({super.key});
|
||||
|
||||
Store the `QueryJob` somewhere globally accessible in your project so you can reuse it later
|
||||
|
||||
Now you can use this `QueryJob` anywhere inside your flutter app inside the build method using a `QueryBuilder` widget
|
||||
|
||||
```dart
|
||||
Widget build(BuildContext context){
|
||||
return QueryBuilder<String, void>(
|
||||
job: exampleQueryJob,
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
if (!query.hasData || query.isLoading) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text(query.data!),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
// refetches the query
|
||||
await query.refetch();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
Or if you're an elite **flutter_hooks** user you can use the `useQuery` hook which is exported from the `package:fl_query_hooks/fl_query_hooks.dart` to do the same thing as above
|
||||
|
||||
```dart
|
||||
/* other imports */
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:fl_query_hooks/fl_query_hooks.dart'; // importing the fl-query hook package
|
||||
|
||||
class Example extends HookWidget{
|
||||
Example(super.key);
|
||||
|
||||
Widget build(BuildContext context) {
|
||||
final query = useQuery(job: exampleQueryJob, externalData: null);
|
||||
|
||||
if (!query.hasData || query.isLoading) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text(query.data!),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
// refetches the query
|
||||
await query.refetch();
|
||||
},
|
||||
@override
|
||||
build(context){
|
||||
return QueryBuilder<String, dynamic>(
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6), () => 'Hello World!');
|
||||
},
|
||||
initial: 'A replacement',
|
||||
jsonConfig: JsonConfig(
|
||||
fromJson: (json) => json['data'],
|
||||
toJson: (data) => {'data': data},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('onError: $error');
|
||||
},
|
||||
builder: (context, query) {
|
||||
if (query.isLoading) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (query.hasError) {
|
||||
return Center(
|
||||
child: Text(query.error.toString()),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Text(query.data ?? "Unfortunately, there's no data"),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And if you're using **flutter_hooks** you got that too
|
||||
|
||||
```dart
|
||||
class MyApp extends HookWidget{
|
||||
MyApp({super.key});
|
||||
|
||||
@override
|
||||
build(context){
|
||||
final query = useQuery<String, dynamic>(
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6), () => 'Hello World!');
|
||||
},
|
||||
initial: 'A replacement',
|
||||
jsonConfig: JsonConfig(
|
||||
fromJson: (json) => json['data'],
|
||||
toJson: (data) => {'data': data},
|
||||
),
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('onError: $error');
|
||||
},
|
||||
);
|
||||
|
||||
if (query.isLoading) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (query.hasError) {
|
||||
return Center(
|
||||
child: Text(query.error.toString()),
|
||||
);
|
||||
}
|
||||
return Center(
|
||||
child: Text(query.data ?? "Unfortunately, there's no data"),
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
*To master the fl-query follow the official blog at https://fl-query.vercel.app/blog*
|
||||
|
||||
# Why?
|
||||
<p align="center">
|
||||
<img src="https://media.giphy.com/media/1M9fmo1WAFVK0/giphy.gif" alt="The hell, why?">
|
||||
</p>
|
||||
|
||||
The main purpose of Fl-Query is providing the easiest way to manage the messy server-state part requiring the least amount of code with code reusability & performance
|
||||
This let's you focus more on those cool UI animations & transitions✨. Leave the boring stuff to fl-query
|
||||
|
||||
**Isn't `FutureBuilder` good?**
|
||||
Yes but it is only if your commercial server has huge load of power & you're made of money or your app is simple or mostly offline & barely requires internet connection
|
||||
`FutureBuilder` isn't good for data persistency & its impossible to share data across the entire application using it
|
||||
**Q. Isn't `FutureBuilder` good?**
|
||||
|
||||
**So `FutureProvider` from riverpod or provider not enough?**
|
||||
Yeah, indeed its more than enough for many applications but what if your app needs Optimistic Updates & proper server-state synchronization or simply want a custom `cacheTime`? Although `FutureProvider` is a viable solution most of the `Future` related stuff, why not kick it up a notch with smart refetching capabilities with proper server-state synchronization?
|
||||
Riverpod is definitely a inspiration for Fl-Query & the `QueryJob` is actually inspired by riverpod & imo is the best state management solution any library has ever provided but that's still a client state manager just like other client state manager or synchronous data manager
|
||||
No, of course not. Unless you're from 2013 or your app is a purely offline app
|
||||
|
||||
**Q. So `FutureProvider` from riverpod or provider not enough?**
|
||||
|
||||
Probably yes. Although riverpod@v2 has added a lot of caching related features but still optimistic updates, periodic refetching & disk persistence are missing. Let's not forget about infinite pagination, it's a nightmare😅. In case of provider, same story. It's a great package but it's not ideal for server-state management
|
||||
|
||||
# Notice Board
|
||||
|
||||
This project is currently under heavy development & not yet production ready. There are lot of features to cover. If anyone encounters any unintended behavior or any bug please report it. Also we're open to improvement suggestions & feature requests
|
||||
|
||||
**Important!:** The project needs Dart-Flutter developers who are willing to contribute to the project by writing Tests. (I'm the worst example for tester)
|
||||
We need some bada** coders to write tests and ruin our life🥲
|
||||
100% coverage is our goal🙃
|
||||
@@ -1,12 +0,0 @@
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
connectivity_plus=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/
|
||||
connectivity_plus_linux=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/
|
||||
connectivity_plus_macos=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.4/
|
||||
connectivity_plus_web=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/
|
||||
connectivity_plus_windows=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/
|
||||
path_provider=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.11/
|
||||
path_provider_android=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.22/
|
||||
path_provider_ios=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.11/
|
||||
path_provider_linux=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/
|
||||
path_provider_macos=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/
|
||||
path_provider_windows=/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/
|
||||
@@ -1 +0,0 @@
|
||||
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_ios","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.11/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.9/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.22/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.4/","native_build":true,"dependencies":[]},{"name":"path_provider_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.6/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/","native_build":false,"dependencies":[]}],"windows":[{"name":"connectivity_plus_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/","native_build":false,"dependencies":[]}],"web":[{"name":"connectivity_plus_web","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.5/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-12-24 13:10:41.077116","version":"3.3.8"}
|
||||
@@ -32,9 +32,6 @@ migrate_working_dir/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# This file should be version controlled.
|
||||
|
||||
version:
|
||||
revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
@@ -13,26 +13,26 @@ project_type: app
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: android
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: ios
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: linux
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: macos
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: web
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
- platform: windows
|
||||
create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
|
||||
create_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
base_revision: b06b8b2710955028a6b562f5aa6fe62941d6febf
|
||||
|
||||
# User provided section
|
||||
|
||||
|
||||
@@ -1,16 +1,3 @@
|
||||
# example
|
||||
|
||||
A new Flutter project.
|
||||
|
||||
## Getting Started
|
||||
|
||||
This project is a starting point for a Flutter application.
|
||||
|
||||
A few resources to get you started if this is your first Flutter project:
|
||||
|
||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
||||
|
||||
For help getting started with Flutter development, view the
|
||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
||||
|
||||
@@ -1,29 +1 @@
|
||||
# This file configures the analyzer, which statically analyzes Dart code to
|
||||
# check for errors, warnings, and lints.
|
||||
#
|
||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||
# invoked from the command line by running `flutter analyze`.
|
||||
|
||||
# The following line activates a set of recommended lints for Flutter apps,
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at
|
||||
# https://dart-lang.github.io/linter/lints/index.html.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
||||
|
||||
@@ -46,7 +46,7 @@ android {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.example"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
package io.flutter.plugins;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.Log;
|
||||
|
||||
import io.flutter.embedding.engine.FlutterEngine;
|
||||
|
||||
/**
|
||||
* Generated file. Do not edit.
|
||||
* This file is generated by the Flutter tool based on the
|
||||
* plugins that support the Android platform.
|
||||
*/
|
||||
@Keep
|
||||
public final class GeneratedPluginRegistrant {
|
||||
private static final String TAG = "GeneratedPluginRegistrant";
|
||||
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.connectivity.ConnectivityPlugin());
|
||||
} catch(Exception e) {
|
||||
Log.e(TAG, "Error registering plugin connectivity_plus, dev.fluttercommunity.plus.connectivity.ConnectivityPlugin", e);
|
||||
}
|
||||
try {
|
||||
flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
|
||||
} catch(Exception e) {
|
||||
Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.6.10'
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.1.2'
|
||||
classpath 'com.android.tools.build:gradle:7.2.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#Fri Jun 23 08:50:38 CEST 2017
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||
@@ -1,90 +0,0 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windowz variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@@ -1,5 +0,0 @@
|
||||
sdk.dir=/home/krtirtho/Android/Sdk
|
||||
flutter.sdk=/home/krtirtho/fvm/versions/3.3.5
|
||||
flutter.buildMode=debug
|
||||
flutter.versionName=1.0.0
|
||||
flutter.versionCode=1
|
||||
@@ -21,6 +21,6 @@
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>9.0</string>
|
||||
<string>11.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
// This is a generated file; do not edit or check into version control.
|
||||
FLUTTER_ROOT=/home/krtirtho/fvm/versions/3.3.5
|
||||
FLUTTER_APPLICATION_PATH=/home/krtirtho/dev/fl-query/packages/fl_query/example
|
||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||
FLUTTER_TARGET=lib/main.dart
|
||||
FLUTTER_BUILD_DIR=build
|
||||
FLUTTER_BUILD_NAME=1.0.0
|
||||
FLUTTER_BUILD_NUMBER=1
|
||||
EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
|
||||
EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
|
||||
DART_OBFUSCATION=false
|
||||
TRACK_WIDGET_CREATION=true
|
||||
TREE_SHAKE_ICONS=false
|
||||
PACKAGE_CONFIG=.dart_tool/package_config.json
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
export "FLUTTER_ROOT=/home/krtirtho/fvm/versions/3.3.5"
|
||||
export "FLUTTER_APPLICATION_PATH=/home/krtirtho/dev/fl-query/packages/fl_query/example"
|
||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||
export "FLUTTER_TARGET=lib/main.dart"
|
||||
export "FLUTTER_BUILD_DIR=build"
|
||||
export "FLUTTER_BUILD_NAME=1.0.0"
|
||||
export "FLUTTER_BUILD_NUMBER=1"
|
||||
export "DART_OBFUSCATION=false"
|
||||
export "TRACK_WIDGET_CREATION=true"
|
||||
export "TREE_SHAKE_ICONS=false"
|
||||
export "PACKAGE_CONFIG=.dart_tool/package_config.json"
|
||||
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
@@ -171,6 +171,7 @@
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
@@ -185,6 +186,7 @@
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
@@ -272,7 +274,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -349,7 +351,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -398,7 +400,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
|
||||
|
Before Width: | Height: | Size: 564 B After Width: | Height: | Size: 295 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 704 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,19 +0,0 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// clang-format off
|
||||
|
||||
#ifndef GeneratedPluginRegistrant_h
|
||||
#define GeneratedPluginRegistrant_h
|
||||
|
||||
#import <Flutter/Flutter.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface GeneratedPluginRegistrant : NSObject
|
||||
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
#endif /* GeneratedPluginRegistrant_h */
|
||||
@@ -1,28 +0,0 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// clang-format off
|
||||
|
||||
#import "GeneratedPluginRegistrant.h"
|
||||
|
||||
#if __has_include(<connectivity_plus/ConnectivityPlusPlugin.h>)
|
||||
#import <connectivity_plus/ConnectivityPlusPlugin.h>
|
||||
#else
|
||||
@import connectivity_plus;
|
||||
#endif
|
||||
|
||||
#if __has_include(<path_provider_ios/FLTPathProviderPlugin.h>)
|
||||
#import <path_provider_ios/FLTPathProviderPlugin.h>
|
||||
#else
|
||||
@import path_provider_ios;
|
||||
#endif
|
||||
|
||||
@implementation GeneratedPluginRegistrant
|
||||
|
||||
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
|
||||
[ConnectivityPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"ConnectivityPlusPlugin"]];
|
||||
[FLTPathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPathProviderPlugin"]];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -45,5 +45,7 @@
|
||||
<false/>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
final infiniteQueryJob = InfiniteQueryJob<Map, void, int>(
|
||||
queryKey: "infinite-posts",
|
||||
initialParam: 1,
|
||||
task: (queryKey, pageParam, externalData) async {
|
||||
return jsonDecode(
|
||||
(await http.get(
|
||||
Uri.parse("https://jsonplaceholder.typicode.com/posts/$pageParam"),
|
||||
))
|
||||
.body,
|
||||
);
|
||||
},
|
||||
getNextPageParam: (lastPage, lastParam) {
|
||||
return lastParam + 1;
|
||||
},
|
||||
getPreviousPageParam: (lastPage, lastParam) {
|
||||
return lastParam - 1;
|
||||
},
|
||||
);
|
||||
|
||||
class BasicInfiniteQueryExample extends StatelessWidget {
|
||||
const BasicInfiniteQueryExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(),
|
||||
body: InfiniteQueryBuilder<Map, void, int>(
|
||||
job: infiniteQueryJob,
|
||||
externalData: null,
|
||||
builder: (context, infiniteQuery) {
|
||||
return Stack(
|
||||
children: [
|
||||
ListView.builder(
|
||||
itemCount: infiniteQuery.pages.length + 1,
|
||||
itemBuilder: (context, index) {
|
||||
if (index == 0) {
|
||||
return Text(
|
||||
"""
|
||||
InfiniteQuery properties
|
||||
|
||||
isFetchingNextPage: ${infiniteQuery.isFetchingNextPage}
|
||||
isFetchingPreviousPage: ${infiniteQuery.isFetchingPreviousPage}
|
||||
isLoading: ${infiniteQuery.isLoading}
|
||||
isRefetching: ${infiniteQuery.isRefetching}
|
||||
isError: ${infiniteQuery.isError}
|
||||
isSuccess: ${infiniteQuery.isSuccess}
|
||||
isIdle: ${infiniteQuery.isIdle}
|
||||
isInactive: ${infiniteQuery.isInactive}
|
||||
isStale: ${infiniteQuery.isStale}
|
||||
fetched: ${infiniteQuery.fetched}
|
||||
|
||||
hasData: ${infiniteQuery.hasData}
|
||||
hasError: ${infiniteQuery.hasError}
|
||||
hasNextPage: ${infiniteQuery.hasNextPage}
|
||||
hasPreviousPage: ${infiniteQuery.hasPreviousPage}
|
||||
|
||||
refetchCount: ${infiniteQuery.refetchCount}
|
||||
retryAttempts: ${infiniteQuery.retryAttempts}
|
||||
updatedAt: ${infiniteQuery.updatedAt}
|
||||
""",
|
||||
);
|
||||
}
|
||||
final page = infiniteQuery.pages[index - 1];
|
||||
return ListTile(
|
||||
title: Text(page?["title"] ?? ""),
|
||||
subtitle: Text(page?["body"] ?? ""),
|
||||
);
|
||||
},
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.bottomRight,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.refresh_rounded),
|
||||
onPressed: () => infiniteQuery.refetchPages(),
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.get_app_rounded),
|
||||
onPressed: () => infiniteQuery.fetchNextPage(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query_example/components/basic_query.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final basicMutationJob = MutationJob<Map, Map<String, dynamic>>(
|
||||
mutationKey: "basic-mutation-example",
|
||||
task: (key, data) async {
|
||||
final response = await http.post(
|
||||
Uri.parse(
|
||||
// to simulate a failing response environment
|
||||
Random().nextBool()
|
||||
? "https://jsonplaceholder.typicode.com/posts"
|
||||
: "https://google.com",
|
||||
),
|
||||
headers: {'Content-type': 'application/json; charset=UTF-8'},
|
||||
body: jsonEncode(data),
|
||||
);
|
||||
return jsonDecode(response.body);
|
||||
},
|
||||
);
|
||||
|
||||
class BasicMutationExample extends StatefulWidget {
|
||||
const BasicMutationExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<BasicMutationExample> createState() => _BasicMutationExampleState();
|
||||
}
|
||||
|
||||
class _BasicMutationExampleState extends State<BasicMutationExample> {
|
||||
late TextEditingController titleController;
|
||||
late TextEditingController bodyController;
|
||||
late int id;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
id = Random().nextInt(2000000);
|
||||
titleController = TextEditingController();
|
||||
bodyController = TextEditingController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
titleController.dispose();
|
||||
bodyController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Basic Mutation Example (with Failure & Retry simulation)",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
MutationBuilder<Map, Map<String, dynamic>>(
|
||||
job: basicMutationJob,
|
||||
onMutate: (v) {
|
||||
final data =
|
||||
QueryBowl.of(context).getQuery(successJob.queryKey)?.data;
|
||||
QueryBowl.of(context)
|
||||
.setQueryData<String, void>(successJob.queryKey, (oldData) {
|
||||
if (oldData?.contains("After Mutate (OPTIMISTIC UPDATE)") ==
|
||||
true) {
|
||||
return "$oldData";
|
||||
}
|
||||
return "$oldData - After Mutate (OPTIMISTIC UPDATE)";
|
||||
});
|
||||
return data;
|
||||
},
|
||||
onData: (data, variables, context) {
|
||||
print("Passed Variable: $variables");
|
||||
print("Safe Previous Value: $context");
|
||||
},
|
||||
builder: (context, mutation) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
TextField(
|
||||
controller: titleController,
|
||||
decoration: const InputDecoration(labelText: "Title"),
|
||||
),
|
||||
TextField(
|
||||
controller: bodyController,
|
||||
decoration: const InputDecoration(labelText: "Body"),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
final title = titleController.value.text;
|
||||
final body = bodyController.value.text;
|
||||
if (body.isEmpty || title.isEmpty) return;
|
||||
mutation.mutate({
|
||||
"title": title,
|
||||
"body": body,
|
||||
"id": id,
|
||||
}, onData: (data, variables, context) {
|
||||
// resetting the form
|
||||
titleController.text = "";
|
||||
bodyController.text = "";
|
||||
});
|
||||
},
|
||||
child: const Text("Post"),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
if (mutation.hasData) Text("Response\n${mutation.data}"),
|
||||
if (mutation.hasError) Text(mutation.error.toString()),
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final bowl = QueryBowl();
|
||||
|
||||
final successJob = QueryJob<String, void>(
|
||||
queryKey: "greetings-example",
|
||||
task: (queryKey, _) => Future.delayed(
|
||||
const Duration(seconds: 2),
|
||||
() =>
|
||||
"The work successfully executed. Data: key=($queryKey) value=${Random.secure().nextInt(100)}",
|
||||
),
|
||||
);
|
||||
|
||||
final canFailJob = QueryJob<String, void>(
|
||||
queryKey: "failure-example",
|
||||
task: (queryKey, _) => Random().nextBool()
|
||||
? Future.error("$queryKey operation failed for unknown reason")
|
||||
: Future.value(
|
||||
"Successful execution. Result: $queryKey=${Random().nextInt(100)}",
|
||||
),
|
||||
);
|
||||
|
||||
class BasicQueryExample extends StatelessWidget {
|
||||
const BasicQueryExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Basic Query Example",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
QueryBuilder<String, void>(
|
||||
job: successJob,
|
||||
externalData: null,
|
||||
onData: (data) {
|
||||
print("Success: $data");
|
||||
},
|
||||
builder: (context, query) {
|
||||
if (!query.hasData || query.isLoading || query.isRefetching) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text(query.data!),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
await query.refetch();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
QueryBuilder<String, void>(
|
||||
job: canFailJob,
|
||||
externalData: null,
|
||||
onError: (error) {
|
||||
print("Error: $error");
|
||||
},
|
||||
builder: (context, query) {
|
||||
if (!query.hasData || query.isLoading || query.isRefetching) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
if (query.hasError)
|
||||
Text(
|
||||
"${query.error}. Retrying: ${query.retryAttempts}",
|
||||
),
|
||||
if (query.hasData)
|
||||
Text(
|
||||
"Success after ${query.retryAttempts}\nData: ${query.data}",
|
||||
),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch"),
|
||||
onPressed: () async {
|
||||
await query.refetch();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
class Todo {
|
||||
int? userId;
|
||||
int? id;
|
||||
String? title;
|
||||
bool? completed;
|
||||
|
||||
Todo({this.userId, this.id, this.title, this.completed});
|
||||
|
||||
Todo.fromJson(Map<String, dynamic> json) {
|
||||
userId = json['userId'];
|
||||
id = json['id'];
|
||||
title = json['title'];
|
||||
completed = json['completed'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = {};
|
||||
data['userId'] = userId;
|
||||
data['id'] = id;
|
||||
data['title'] = title;
|
||||
data['completed'] = completed;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
final infiniteQueryDiskCacheExampleQuery =
|
||||
InfiniteQueryJob<List<Todo>, void, int>(
|
||||
queryKey: 'infiniteQueryDiskCacheExampleQuery',
|
||||
initialParam: 0,
|
||||
getNextPageParam: (lastPage, lastParam) {
|
||||
if (lastPage.length < 5) return null;
|
||||
return lastParam + 5;
|
||||
},
|
||||
getPreviousPageParam: (firstPage, firstParam) {
|
||||
if (firstParam == 0) return null;
|
||||
return firstParam - 5;
|
||||
},
|
||||
serialize: (data) {
|
||||
return jsonEncode(data.map((todo) => todo.toJson()).toList());
|
||||
},
|
||||
deserialize: (raw) {
|
||||
return List.from(jsonDecode(raw))
|
||||
.map((todo) => Todo.fromJson(todo))
|
||||
.toList();
|
||||
},
|
||||
serializePageParam: (param) => param.toString(),
|
||||
deserializePageParam: (rawParam) => int.parse(rawParam),
|
||||
task: (_, pageParam, __) async {
|
||||
final res = await http.get(
|
||||
Uri.parse(
|
||||
"https://jsonplaceholder.typicode.com/todos?_start=$pageParam&_end=${pageParam + 5}"),
|
||||
);
|
||||
final body = List.from(jsonDecode(res.body))
|
||||
.map((todo) => Todo.fromJson(todo))
|
||||
.toList()
|
||||
..shuffle();
|
||||
if (pageParam == 0) await Future.delayed(const Duration(seconds: 5));
|
||||
return body;
|
||||
},
|
||||
);
|
||||
|
||||
class InfiniteQueryDiskCacheExample extends StatefulWidget {
|
||||
const InfiniteQueryDiskCacheExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<InfiniteQueryDiskCacheExample> createState() =>
|
||||
_InfiniteQueryDiskCacheExampleState();
|
||||
}
|
||||
|
||||
class _InfiniteQueryDiskCacheExampleState
|
||||
extends State<InfiniteQueryDiskCacheExample> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListTile(
|
||||
title: const Text("Infinite Query Disk Cache Example"),
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("Infinite Query Disk Cache Example")),
|
||||
body: InfiniteQueryBuilder<List<Todo>, void, int>(
|
||||
job: infiniteQueryDiskCacheExampleQuery,
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
final data = query.pages
|
||||
.expand((page) => page?.toList() ?? <Todo>[])
|
||||
.toList();
|
||||
return Scaffold(
|
||||
floatingActionButton: FloatingActionButton(
|
||||
child: const Icon(Icons.download_rounded),
|
||||
onPressed: () {
|
||||
if (query.hasNextPage == true) {
|
||||
query.fetchNextPage();
|
||||
}
|
||||
},
|
||||
),
|
||||
body: ListView.builder(
|
||||
itemCount: data.length,
|
||||
itemBuilder: (context, index) {
|
||||
return CheckboxListTile(
|
||||
value: data[index].completed == true,
|
||||
title: Text(data[index].title ?? ""),
|
||||
dense: true,
|
||||
secondary: Text(data[index].id.toString()),
|
||||
onChanged: null,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final lazyQueryJob = QueryJob<String, String>(
|
||||
queryKey: "lazy-query",
|
||||
enabled: false,
|
||||
task: (
|
||||
queryKey,
|
||||
data,
|
||||
) {
|
||||
return Future.delayed(const Duration(milliseconds: 500),
|
||||
() => "Result: key=$queryKey value=$data");
|
||||
},
|
||||
);
|
||||
|
||||
class LazyQueryExample extends StatelessWidget {
|
||||
const LazyQueryExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Lazy Query Example",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
QueryBuilder<String, String>(
|
||||
job: lazyQueryJob,
|
||||
externalData: "Love",
|
||||
builder: (context, query) {
|
||||
return Row(
|
||||
children: [
|
||||
Text("Current Data: ${query.data ?? "Loading"}"),
|
||||
ElevatedButton(
|
||||
child: const Text("Refetch Query"),
|
||||
onPressed: () => query.refetch(),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final mutationVariableKeyJob = MutationJob.withVariableKey<String, double>(
|
||||
preMutationKey: "mutation-example",
|
||||
task: (queryKey, variables) {
|
||||
return Future.value("$variables");
|
||||
},
|
||||
);
|
||||
|
||||
class MutationVariableKeyExample extends StatefulWidget {
|
||||
const MutationVariableKeyExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<MutationVariableKeyExample> createState() =>
|
||||
_MutationVariableKeyExampleState();
|
||||
}
|
||||
|
||||
class _MutationVariableKeyExampleState
|
||||
extends State<MutationVariableKeyExample> {
|
||||
late double id;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
id = Random().nextDouble();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Mutation Variable Key Example",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
MutationBuilder<String, double>(
|
||||
job: mutationVariableKeyJob(id.toString()),
|
||||
builder: (context, mutation) {
|
||||
return Row(
|
||||
children: [
|
||||
Text("${mutation.mutationKey} Result: ${mutation.data}"),
|
||||
ElevatedButton(
|
||||
child: const Text("Generate Random Data"),
|
||||
onPressed: () {
|
||||
mutation.mutate(Random().nextDouble());
|
||||
},
|
||||
),
|
||||
ElevatedButton(
|
||||
child: const Text("New Mutation"),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
id = Random().nextDouble();
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
final queryDiskCacheExampleQuery = QueryJob<List<User>, void>(
|
||||
queryKey: 'queryDiskCacheExampleQuery',
|
||||
serialize: (data) {
|
||||
return jsonEncode(data.map((user) => user.toJson()).toList());
|
||||
},
|
||||
deserialize: (raw) {
|
||||
return List.from(jsonDecode(raw))
|
||||
.map((user) => User.fromJson(user))
|
||||
.toList();
|
||||
},
|
||||
task: (_, __) async {
|
||||
final res =
|
||||
await http.get(Uri.parse("https://jsonplaceholder.typicode.com/users"));
|
||||
final body = List.from(jsonDecode(res.body))
|
||||
.map((user) => User.fromJson(user))
|
||||
.toList()
|
||||
..shuffle();
|
||||
await Future.delayed(const Duration(seconds: 5));
|
||||
return body;
|
||||
},
|
||||
);
|
||||
|
||||
class User {
|
||||
int? id;
|
||||
String? name;
|
||||
String? username;
|
||||
String? email;
|
||||
|
||||
User({this.id, this.name, this.username, this.email});
|
||||
|
||||
User.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
name = json['name'];
|
||||
username = json['username'];
|
||||
email = json['email'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = {};
|
||||
data['id'] = id;
|
||||
data['name'] = name;
|
||||
data['username'] = username;
|
||||
data['email'] = email;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class QueryDiskCacheExample extends StatelessWidget {
|
||||
const QueryDiskCacheExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QueryBuilder<List<User>, void>(
|
||||
job: queryDiskCacheExampleQuery,
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
if (!query.hasData) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
return ListView.builder(
|
||||
shrinkWrap: true,
|
||||
itemCount: query.data?.length,
|
||||
itemBuilder: (context, index) {
|
||||
return ListTile(
|
||||
title: Text(query.data![index].name!),
|
||||
subtitle: Text(query.data![index].email!),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final jobWithExternalData = QueryJob<String, double>(
|
||||
queryKey: "query-external-data",
|
||||
cacheTime: const Duration(seconds: 10),
|
||||
refetchOnExternalDataChange: true,
|
||||
task: (queryKey, data) {
|
||||
return Future.delayed(const Duration(milliseconds: 500),
|
||||
() => "Hello from $queryKey with $data");
|
||||
},
|
||||
);
|
||||
|
||||
class QueryExternalDataExample extends StatefulWidget {
|
||||
const QueryExternalDataExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<QueryExternalDataExample> createState() =>
|
||||
_QueryExternalDataExampleState();
|
||||
}
|
||||
|
||||
class _QueryExternalDataExampleState extends State<QueryExternalDataExample> {
|
||||
late double externalData;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
externalData = Random().nextDouble() * 200;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Query With External Data Example",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
QueryBuilder<String, double>(
|
||||
job: jobWithExternalData,
|
||||
externalData: externalData,
|
||||
builder: (context, query) {
|
||||
if (query.isLoading || query.isRefetching || !query.hasData) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Container(
|
||||
width: query.externalData,
|
||||
height: query.externalData,
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Colors.blue,
|
||||
),
|
||||
child: Center(child: Text(query.externalData.toString())),
|
||||
),
|
||||
ElevatedButton(
|
||||
child: const Text("New Id"),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
externalData = Random().nextDouble() * 200;
|
||||
});
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
final todoJob = QueryJob.withVariableKey<Map, void>(
|
||||
preQueryKey: "todo",
|
||||
task: (queryKey, _) async {
|
||||
final res = await http.get(
|
||||
Uri.parse(
|
||||
"https://jsonplaceholder.typicode.com/todos/${getVariable(queryKey)}"),
|
||||
);
|
||||
return jsonDecode(res.body);
|
||||
},
|
||||
keepPreviousData: true,
|
||||
);
|
||||
|
||||
class QueryPreviousDataExample extends StatefulWidget {
|
||||
const QueryPreviousDataExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<QueryPreviousDataExample> createState() =>
|
||||
_QueryPreviousDataExampleState();
|
||||
}
|
||||
|
||||
class _QueryPreviousDataExampleState extends State<QueryPreviousDataExample> {
|
||||
int id = 1;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Query Variable Key with keepPreviousData",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
QueryBuilder(
|
||||
job: todoJob(id.toString()),
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
if (query.hasError) return Text(query.error.toString());
|
||||
if (!query.hasData) return const CircularProgressIndicator();
|
||||
return Text(jsonEncode(query.data ?? {}));
|
||||
}),
|
||||
Row(
|
||||
children: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.remove),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
id -= 1;
|
||||
});
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.add),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
id += 1;
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final queryVariableKeyJob = QueryJob.withVariableKey<String, void>(
|
||||
preQueryKey: "variable-query",
|
||||
task: (queryKey, externalData) {
|
||||
return Future.delayed(
|
||||
const Duration(milliseconds: 500),
|
||||
() => "QueryKey:${queryKey.split("#").last}",
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
class QueryVariableKeyExample extends StatefulWidget {
|
||||
const QueryVariableKeyExample({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<QueryVariableKeyExample> createState() =>
|
||||
_QueryVariableKeyExampleState();
|
||||
}
|
||||
|
||||
class _QueryVariableKeyExampleState extends State<QueryVariableKeyExample> {
|
||||
late double id;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
id = Random().nextDouble() * 200;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"# Query Variable Example",
|
||||
style: Theme.of(context).textTheme.headline5,
|
||||
),
|
||||
QueryBuilder<String, void>(
|
||||
job: queryVariableKeyJob(id.toString()),
|
||||
externalData: null,
|
||||
builder: (context, query) {
|
||||
if (query.isLoading || query.isRefetching || !query.hasData) {
|
||||
return const CircularProgressIndicator();
|
||||
}
|
||||
return Row(
|
||||
children: [
|
||||
Text("Query Result: ${query.data}"),
|
||||
ElevatedButton(
|
||||
child: const Text("New Id"),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
id = Random().nextDouble() * 200;
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// ignore_for_file: directives_ordering
|
||||
// ignore_for_file: lines_longer_than_80_chars
|
||||
// ignore_for_file: depend_on_referenced_packages
|
||||
|
||||
import 'package:connectivity_plus_web/connectivity_plus_web.dart';
|
||||
|
||||
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
||||
|
||||
// ignore: public_member_api_docs
|
||||
void registerPlugins(Registrar registrar) {
|
||||
ConnectivityPlusPlugin.registerWith(registrar);
|
||||
registrar.registerMessageHandler();
|
||||
}
|
||||
@@ -1,87 +1,44 @@
|
||||
import 'package:fl_query_example/components/basic_infinite_query.dart';
|
||||
import 'package:fl_query_example/components/basic_mutation.dart';
|
||||
import 'package:fl_query_connectivity_plus_adapter/fl_query_connectivity_plus_adapter.dart';
|
||||
import 'package:fl_query_devtools/fl_query_devtools.dart';
|
||||
import 'package:fl_query_example/router.dart';
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:fl_query_example/components/basic_query.dart';
|
||||
import 'package:fl_query_example/components/infinite_query_disk_cache.dart';
|
||||
import 'package:fl_query_example/components/lazy_query.dart';
|
||||
import 'package:fl_query_example/components/mutation_variable_key.dart';
|
||||
import 'package:fl_query_example/components/query_disk_cache.dart';
|
||||
import 'package:fl_query_example/components/query_external_data.dart';
|
||||
import 'package:fl_query_example/components/query_previous_data.dart';
|
||||
import 'package:fl_query_example/components/query_variable_key.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await initializeFlQuery(cacheKey: "example");
|
||||
debugRepaintRainbowEnabled = true;
|
||||
runApp(const MyApp());
|
||||
await QueryClient.initialize(
|
||||
cachePrefix: 'fl_query_example',
|
||||
connectivity: FlQueryConnectivityPlusAdapter(),
|
||||
);
|
||||
runApp(
|
||||
QueryClientProvider(
|
||||
child: const MainApp(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({Key? key}) : super(key: key);
|
||||
class MainApp extends StatelessWidget {
|
||||
const MainApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return QueryBowlScope(
|
||||
bowl: QueryBowl(),
|
||||
child: MaterialApp(
|
||||
// showPerformanceOverlay: true,
|
||||
title: 'Flutter Demo',
|
||||
theme: ThemeData(
|
||||
useMaterial3: true,
|
||||
primarySwatch: Colors.blue,
|
||||
),
|
||||
home: const MyHomePage(),
|
||||
return MaterialApp.router(
|
||||
theme: ThemeData(
|
||||
colorSchemeSeed: Colors.red[100],
|
||||
useMaterial3: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class MyHomePage extends StatefulWidget {
|
||||
const MyHomePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<MyHomePage> createState() => _MyHomePageState();
|
||||
}
|
||||
|
||||
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("Fl Query Example"),
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
const BasicQueryExample(),
|
||||
const QueryExternalDataExample(),
|
||||
const LazyQueryExample(),
|
||||
const QueryVariableKeyExample(),
|
||||
const QueryPreviousDataExample(),
|
||||
ListTile(
|
||||
title: const Text("Infinite Query Example"),
|
||||
trailing: const Icon(Icons.open_in_new),
|
||||
onTap: () {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const BasicInfiniteQueryExample(),
|
||||
),
|
||||
);
|
||||
},
|
||||
title: 'FL Query Example',
|
||||
builder: (context, child) {
|
||||
return FlQueryDevtools(
|
||||
child: QueryStateResolverProvider(
|
||||
child: child!,
|
||||
offline: () => const Center(
|
||||
child: Text("Why u offline? How can u live?"),
|
||||
),
|
||||
const QueryDiskCacheExample(),
|
||||
const InfiniteQueryDiskCacheExample(),
|
||||
const Divider(),
|
||||
const BasicMutationExample(),
|
||||
const MutationVariableKeyExample(),
|
||||
],
|
||||
),
|
||||
)),
|
||||
),
|
||||
);
|
||||
},
|
||||
routerConfig: router,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
class Product {
|
||||
int id;
|
||||
String title;
|
||||
String description;
|
||||
double price;
|
||||
double discountPercentage;
|
||||
double rating;
|
||||
double stock;
|
||||
String brand;
|
||||
String category;
|
||||
String thumbnail;
|
||||
List<String> images;
|
||||
|
||||
Product({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.description,
|
||||
required this.price,
|
||||
required this.discountPercentage,
|
||||
required this.rating,
|
||||
required this.stock,
|
||||
required this.brand,
|
||||
required this.category,
|
||||
required this.thumbnail,
|
||||
required this.images,
|
||||
});
|
||||
|
||||
Product.fromJson(Map<String, dynamic> json)
|
||||
: id = json['id'],
|
||||
title = json['title'],
|
||||
description = json['description'],
|
||||
price = json['price'].toDouble(),
|
||||
discountPercentage = json['discountPercentage'].toDouble(),
|
||||
rating = json['rating'].toDouble(),
|
||||
stock = json['stock'].toDouble(),
|
||||
brand = json['brand'],
|
||||
category = json['category'],
|
||||
thumbnail = json['thumbnail'],
|
||||
images = json['images'].cast<String>();
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{
|
||||
'id': id,
|
||||
'title': title,
|
||||
'description': description,
|
||||
'price': price,
|
||||
'discountPercentage': discountPercentage,
|
||||
'rating': rating,
|
||||
'stock': stock,
|
||||
'brand': brand,
|
||||
'category': category,
|
||||
'thumbnail': thumbnail,
|
||||
'images': images,
|
||||
};
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class PagedProducts {
|
||||
List<Product> products;
|
||||
int total;
|
||||
int skip;
|
||||
int limit;
|
||||
|
||||
PagedProducts({
|
||||
this.products = const [],
|
||||
required this.total,
|
||||
required this.skip,
|
||||
required this.limit,
|
||||
});
|
||||
|
||||
PagedProducts.fromJson(Map<String, dynamic> json)
|
||||
: products = json['products']
|
||||
?.map<Product>((v) => Product.fromJson(
|
||||
Map.castFrom<dynamic, dynamic, String, dynamic>(v),
|
||||
))
|
||||
.toList() ??
|
||||
[],
|
||||
total = json['total'],
|
||||
skip = json['skip'],
|
||||
limit = json['limit'];
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{
|
||||
'products': products.map((v) => v.toJson()).toList(),
|
||||
'total': total,
|
||||
'skip': skip,
|
||||
'limit': limit,
|
||||
};
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
class HomePage extends StatelessWidget {
|
||||
const HomePage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('FL Query Example'),
|
||||
),
|
||||
body: ListView(
|
||||
children: [
|
||||
ListTile(
|
||||
title: const Text('Query'),
|
||||
onTap: () => GoRouter.of(context).push('/query'),
|
||||
),
|
||||
ListTile(
|
||||
title: const Text('Infinite Query'),
|
||||
onTap: () => GoRouter.of(context).push('/infinite-query'),
|
||||
),
|
||||
ListTile(
|
||||
title: const Text('Mutation'),
|
||||
onTap: () => GoRouter.of(context).push('/mutation'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:fl_query_example/models/product.dart';
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
|
||||
class InfiniteQueryPageWidget extends StatefulWidget {
|
||||
const InfiniteQueryPageWidget({super.key});
|
||||
|
||||
@override
|
||||
State<InfiniteQueryPageWidget> createState() =>
|
||||
_InfiniteQueryPageWidgetState();
|
||||
}
|
||||
|
||||
class _InfiniteQueryPageWidgetState extends State<InfiniteQueryPageWidget> {
|
||||
final controller = ScrollController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
controller.addListener(() async {
|
||||
if (controller.position.pixels == controller.position.maxScrollExtent) {
|
||||
final query = QueryClient.of(context).getInfiniteQuery("products");
|
||||
await query?.fetchNext();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Infinite Query'),
|
||||
),
|
||||
floatingActionButton:
|
||||
InfiniteQueryListenable("products", builder: (context, query) {
|
||||
return FloatingActionButton(
|
||||
onPressed: () {
|
||||
query?.fetchNext();
|
||||
},
|
||||
child: Text(query?.pages.length.toString() ?? "-69"),
|
||||
);
|
||||
}),
|
||||
body: InfiniteQueryBuilder<PagedProducts, ClientException, int>(
|
||||
"products",
|
||||
(page) async {
|
||||
final res = await get(Uri.parse(
|
||||
"https://dummyjson.com/products?limit=10&skip=${page * 10}",
|
||||
));
|
||||
|
||||
if (res.statusCode == 200) {
|
||||
return PagedProducts.fromJson(jsonDecode(res.body));
|
||||
} else {
|
||||
throw ClientException(res.statusCode.toString(), res.request?.url);
|
||||
}
|
||||
},
|
||||
nextPage: (lastPage, lastPageData) {
|
||||
/// returning [null] will set [hasNextPage] to [false]
|
||||
if (lastPageData.products.length < 10) return null;
|
||||
return lastPage + 1;
|
||||
},
|
||||
initialPage: 0,
|
||||
// jsonConfig: JsonConfig(
|
||||
// fromJson: (json) => PagedProducts.fromJson(json),
|
||||
// toJson: (data) => data.toJson(),
|
||||
// ),
|
||||
builder: (context, query) {
|
||||
final products = query.pages.map((e) => e.products).expand((e) => e);
|
||||
|
||||
return query.resolve(
|
||||
(data) => ListView(
|
||||
controller: controller,
|
||||
children: [
|
||||
for (final product in products)
|
||||
ListTile(
|
||||
title: Text(product.title),
|
||||
subtitle: Text(product.description),
|
||||
leading: Image.network(product.thumbnail),
|
||||
),
|
||||
if (query.hasNextPage)
|
||||
const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
if (query.hasErrors)
|
||||
...query.errors.map((e) => Text(e.message)).toList(),
|
||||
],
|
||||
),
|
||||
loading: () => const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
error: (error) => const Center(
|
||||
child: Text("Sorry! There was an error :'("),
|
||||
),
|
||||
offline: () => const Center(
|
||||
child: Text("Yo. You're offline. Are you in a jungle?"),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class MutationPage extends StatefulWidget {
|
||||
const MutationPage({super.key});
|
||||
|
||||
@override
|
||||
State<MutationPage> createState() => _MutationPageState();
|
||||
}
|
||||
|
||||
class _MutationPageState extends State<MutationPage> {
|
||||
late TextEditingController _nameController;
|
||||
late TextEditingController _emailController;
|
||||
late TextEditingController _passwordController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_nameController = TextEditingController();
|
||||
_emailController = TextEditingController();
|
||||
_passwordController = TextEditingController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_nameController.dispose();
|
||||
_emailController.dispose();
|
||||
_passwordController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Mutation'),
|
||||
),
|
||||
body: MutationBuilder<Map<String, dynamic>, dynamic, Map<String, dynamic>,
|
||||
dynamic>(
|
||||
'sign-up',
|
||||
(variables) {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 5),
|
||||
() => {
|
||||
'name': variables['name'],
|
||||
'email': variables['email'],
|
||||
'password': variables['password'],
|
||||
},
|
||||
);
|
||||
},
|
||||
onMutate: (variables) {
|
||||
debugPrint('onMutate: $variables');
|
||||
return "Recover ME";
|
||||
},
|
||||
onData: (data, recoveryData) {
|
||||
debugPrint('onData: $data');
|
||||
debugPrint('recoveryData: $recoveryData');
|
||||
},
|
||||
refreshQueries: const ['hello'],
|
||||
builder: (context, mutation) {
|
||||
if (mutation.hasData) {
|
||||
return ListView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
children: [
|
||||
Center(
|
||||
child: Text('Welcome ${mutation.data!['name']}'),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Center(
|
||||
child: Text('Your email is ${mutation.data!['email']}'),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
mutation.reset();
|
||||
},
|
||||
child: const Text('Log out'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return ListView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
children: [
|
||||
TextField(
|
||||
controller: _nameController,
|
||||
keyboardType: TextInputType.name,
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Name',
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
TextField(
|
||||
controller: _emailController,
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Email',
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
TextField(
|
||||
controller: _passwordController,
|
||||
obscureText: true,
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Password',
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
await mutation.mutate({
|
||||
'name': _nameController.text,
|
||||
'email': _emailController.text,
|
||||
'password': _passwordController.text,
|
||||
});
|
||||
},
|
||||
child: mutation.isMutating
|
||||
? const CircularProgressIndicator()
|
||||
: const Text('Sign Up'),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class QueryPage extends StatelessWidget {
|
||||
const QueryPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final value = Random().nextInt(200000);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Query'),
|
||||
),
|
||||
floatingActionButton:
|
||||
QueryListenable<String, dynamic>('hello', builder: (context, query) {
|
||||
if (query == null) {
|
||||
return const SizedBox();
|
||||
}
|
||||
return FloatingActionButton(
|
||||
onPressed: () {
|
||||
query.refresh();
|
||||
},
|
||||
child: Text(query.data ?? 'No Data'),
|
||||
);
|
||||
}),
|
||||
body: QueryBuilder<String, dynamic>(
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6),
|
||||
() => 'Hello World! $value',
|
||||
);
|
||||
},
|
||||
initial: 'Hello',
|
||||
// jsonConfig: JsonConfig(
|
||||
// fromJson: (json) => json['data'],
|
||||
// toJson: (data) => {'data': data},
|
||||
// ),
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
onError: (error) {
|
||||
debugPrint('onError: $error');
|
||||
},
|
||||
builder: (context, query) {
|
||||
return query.resolveWith(
|
||||
context,
|
||||
(data) => Center(child: Text(data)),
|
||||
error: (error) => Center(child: Text(error.toString())),
|
||||
loading: () => const Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import "package:fl_query_example/pages/home.dart";
|
||||
import "package:fl_query_example/pages/infinite_query.dart";
|
||||
import "package:fl_query_example/pages/mutation/mutation.dart";
|
||||
import "package:fl_query_example/pages/query.dart";
|
||||
import "package:go_router/go_router.dart";
|
||||
|
||||
final router = GoRouter(
|
||||
initialLocation: '/',
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: '/',
|
||||
builder: (context, state) => const HomePage(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/query',
|
||||
builder: (context, state) => const QueryPage(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/infinite-query',
|
||||
builder: (context, state) => const InfiniteQueryPageWidget(),
|
||||
),
|
||||
GoRoute(
|
||||
path: '/mutation',
|
||||
builder: (context, state) => const MutationPage(),
|
||||
),
|
||||
],
|
||||
);
|
||||
@@ -1 +0,0 @@
|
||||
/opt/flutter/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/
|
||||
@@ -1,205 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_BASIC_MESSAGE_CHANNEL_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_BASIC_MESSAGE_CHANNEL_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_binary_messenger.h"
|
||||
#include "fl_message_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlBasicMessageChannel,
|
||||
fl_basic_message_channel,
|
||||
FL,
|
||||
BASIC_MESSAGE_CHANNEL,
|
||||
GObject)
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlBasicMessageChannelResponseHandle,
|
||||
fl_basic_message_channel_response_handle,
|
||||
FL,
|
||||
BASIC_MESSAGE_CHANNEL_RESPONSE_HANDLE,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlBasicMessageChannel:
|
||||
*
|
||||
* #FlBasicMessageChannel is an object that allows sending and receiving
|
||||
* messages to/from Dart code over platform channels.
|
||||
*
|
||||
* The following example shows how to send messages on a channel:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* static FlBasicMessageChannel *channel = NULL;
|
||||
*
|
||||
* static void message_cb (FlBasicMessageChannel* channel,
|
||||
* FlValue* message,
|
||||
* FlBasicMessageChannelResponseHandle* response_handle,
|
||||
* gpointer user_data) {
|
||||
* g_autoptr(FlValue) response = handle_message (message);
|
||||
* g_autoptr(GError) error = NULL;
|
||||
* if (!fl_basic_message_channel_respond (channel, response_handle, response,
|
||||
* &error))
|
||||
* g_warning ("Failed to send channel response: %s", error->message);
|
||||
* }
|
||||
*
|
||||
* static void message_response_cb (GObject *object,
|
||||
* GAsyncResult *result,
|
||||
* gpointer user_data) {
|
||||
* g_autoptr(GError) error = NULL;
|
||||
* g_autoptr(FlValue) response =
|
||||
* fl_basic_message_channel_send_finish (FL_BASIC_MESSAGE_CHANNEL (object),
|
||||
* result, &error);
|
||||
* if (response == NULL) {
|
||||
* g_warning ("Failed to send message: %s", error->message);
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* handle_response (response);
|
||||
* }
|
||||
*
|
||||
* static void setup_channel () {
|
||||
* g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new ();
|
||||
* channel = fl_basic_message_channel_new (messenger, "flutter/foo",
|
||||
* FL_MESSAGE_CODEC (codec));
|
||||
* fl_basic_message_channel_set_message_handler (channel, message_cb, NULL,
|
||||
* NULL);
|
||||
*
|
||||
* g_autoptr(FlValue) message = fl_value_new_string ("Hello World");
|
||||
* fl_basic_message_channel_send (channel, message, NULL,
|
||||
* message_response_cb, NULL);
|
||||
* }
|
||||
* ]|
|
||||
*
|
||||
* #FlBasicMessageChannel matches the BasicMessageChannel class in the Flutter
|
||||
* services library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlBasicMessageChannelResponseHandle:
|
||||
*
|
||||
* #FlBasicMessageChannelResponseHandle is an object used to send responses
|
||||
* with.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlBasicMessageChannelMessageHandler:
|
||||
* @channel: an #FlBasicMessageChannel.
|
||||
* @message: message received.
|
||||
* @response_handle: a handle to respond to the message with.
|
||||
* @user_data: (closure): data provided when registering this handler.
|
||||
*
|
||||
* Function called when a message is received. Call
|
||||
* fl_basic_message_channel_respond() to respond to this message. If the
|
||||
* response is not occurring in this callback take a reference to
|
||||
* @response_handle and release that once it has been responded to. Failing to
|
||||
* respond before the last reference to @response_handle is dropped is a
|
||||
* programming error.
|
||||
*/
|
||||
typedef void (*FlBasicMessageChannelMessageHandler)(
|
||||
FlBasicMessageChannel* channel,
|
||||
FlValue* message,
|
||||
FlBasicMessageChannelResponseHandle* response_handle,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_basic_message_channel_new:
|
||||
* @messenger: an #FlBinaryMessenger.
|
||||
* @name: a channel name.
|
||||
* @codec: the message codec.
|
||||
*
|
||||
* Creates a basic message channel. @codec must match the codec used on the Dart
|
||||
* end of the channel.
|
||||
*
|
||||
* Returns: a new #FlBasicMessageChannel.
|
||||
*/
|
||||
FlBasicMessageChannel* fl_basic_message_channel_new(
|
||||
FlBinaryMessenger* messenger,
|
||||
const gchar* name,
|
||||
FlMessageCodec* codec);
|
||||
|
||||
/**
|
||||
* fl_basic_message_channel_set_message_handler:
|
||||
* @channel: an #FlBasicMessageChannel.
|
||||
* @handler: (allow-none): function to call when a message is received on this
|
||||
* channel or %NULL to disable the handler.
|
||||
* @user_data: (closure): user data to pass to @handler.
|
||||
* @destroy_notify: (allow-none): a function which gets called to free
|
||||
* @user_data, or %NULL.
|
||||
*
|
||||
* Sets the function called when a message is received from the Dart side of the
|
||||
* channel. See #FlBasicMessageChannelMessageHandler for details on how to
|
||||
* respond to messages.
|
||||
*
|
||||
* The handler is removed if the channel is closed or is replaced by another
|
||||
* handler, set @destroy_notify if you want to detect this.
|
||||
*/
|
||||
void fl_basic_message_channel_set_message_handler(
|
||||
FlBasicMessageChannel* channel,
|
||||
FlBasicMessageChannelMessageHandler handler,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
/**
|
||||
* fl_basic_message_channel_respond:
|
||||
* @channel: an #FlBasicMessageChannel.
|
||||
* @response_handle: handle that was provided in a
|
||||
* #FlBasicMessageChannelMessageHandler.
|
||||
* @message: (allow-none): message response to send or %NULL for an empty
|
||||
* response.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Responds to a message.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_basic_message_channel_respond(
|
||||
FlBasicMessageChannel* channel,
|
||||
FlBasicMessageChannelResponseHandle* response_handle,
|
||||
FlValue* message,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_basic_message_channel_send:
|
||||
* @channel: an #FlBasicMessageChannel.
|
||||
* @message: message to send, must match what the #FlMessageCodec supports.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @callback: (scope async): (allow-none): a #GAsyncReadyCallback to call when
|
||||
* the request is satisfied or %NULL to ignore the response.
|
||||
* @user_data: (closure): user data to pass to @callback.
|
||||
*
|
||||
* Asynchronously sends a message.
|
||||
*/
|
||||
void fl_basic_message_channel_send(FlBasicMessageChannel* channel,
|
||||
FlValue* message,
|
||||
GCancellable* cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_basic_message_channel_send_finish:
|
||||
* @channel: an #FlBasicMessageChannel.
|
||||
* @result: a #GAsyncResult.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Completes request started with fl_basic_message_channel_send().
|
||||
*
|
||||
* Returns: message response on success or %NULL on error.
|
||||
*/
|
||||
FlValue* fl_basic_message_channel_send_finish(FlBasicMessageChannel* channel,
|
||||
GAsyncResult* result,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_BASIC_MESSAGE_CHANNEL_H_
|
||||
@@ -1,45 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_message_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlBinaryCodec,
|
||||
fl_binary_codec,
|
||||
FL,
|
||||
BINARY_CODEC,
|
||||
FlMessageCodec)
|
||||
|
||||
/**
|
||||
* FlBinaryCodec:
|
||||
*
|
||||
* #FlBinaryCodec is an #FlMessageCodec that implements the Flutter binary
|
||||
* message encoding. This only encodes and decodes #FlValue of type
|
||||
* #FL_VALUE_TYPE_UINT8_LIST, other types #FlValues will generate an error
|
||||
* during encoding.
|
||||
*
|
||||
* #FlBinaryCodec matches the BinaryCodec class in the Flutter services
|
||||
* library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_binary_codec_new:
|
||||
*
|
||||
* Creates an #FlBinaryCodec.
|
||||
*
|
||||
* Returns: a new #FlBinaryCodec.
|
||||
*/
|
||||
FlBinaryCodec* fl_binary_codec_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_CODEC_H_
|
||||
@@ -1,189 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_MESSENGER_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_MESSENGER_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* FlBinaryMessengerError:
|
||||
* @FL_BINARY_MESSENGER_ERROR_ALREADY_RESPONDED: unable to send response, this
|
||||
* message has already been responded to.
|
||||
*
|
||||
* Errors for #FlBinaryMessenger objects to set on failures.
|
||||
*/
|
||||
#define FL_BINARY_MESSENGER_ERROR fl_binary_messenger_codec_error_quark()
|
||||
|
||||
typedef enum {
|
||||
FL_BINARY_MESSENGER_ERROR_ALREADY_RESPONDED,
|
||||
} FlBinaryMessengerError;
|
||||
|
||||
GQuark fl_binary_messenger_codec_error_quark(void) G_GNUC_CONST;
|
||||
|
||||
G_DECLARE_INTERFACE(FlBinaryMessenger,
|
||||
fl_binary_messenger,
|
||||
FL,
|
||||
BINARY_MESSENGER,
|
||||
GObject)
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlBinaryMessengerResponseHandle,
|
||||
fl_binary_messenger_response_handle,
|
||||
FL,
|
||||
BINARY_MESSENGER_RESPONSE_HANDLE,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlBinaryMessengerMessageHandler:
|
||||
* @messenger: an #FlBinaryMessenger.
|
||||
* @channel: channel message received on.
|
||||
* @message: message content received from Dart.
|
||||
* @response_handle: a handle to respond to the message with.
|
||||
* @user_data: (closure): data provided when registering this handler.
|
||||
*
|
||||
* Function called when platform messages are received. Call
|
||||
* fl_binary_messenger_send_response() to respond to this message. If the
|
||||
* response is not occurring in this callback take a reference to
|
||||
* @response_handle and release that once it has been responded to. Failing to
|
||||
* respond before the last reference to @response_handle is dropped is a
|
||||
* programming error.
|
||||
*/
|
||||
typedef void (*FlBinaryMessengerMessageHandler)(
|
||||
FlBinaryMessenger* messenger,
|
||||
const gchar* channel,
|
||||
GBytes* message,
|
||||
FlBinaryMessengerResponseHandle* response_handle,
|
||||
gpointer user_data);
|
||||
|
||||
struct _FlBinaryMessengerInterface {
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
void (*set_message_handler_on_channel)(
|
||||
FlBinaryMessenger* messenger,
|
||||
const gchar* channel,
|
||||
FlBinaryMessengerMessageHandler handler,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
gboolean (*send_response)(FlBinaryMessenger* messenger,
|
||||
FlBinaryMessengerResponseHandle* response_handle,
|
||||
GBytes* response,
|
||||
GError** error);
|
||||
|
||||
void (*send_on_channel)(FlBinaryMessenger* messenger,
|
||||
const gchar* channel,
|
||||
GBytes* message,
|
||||
GCancellable* cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
GBytes* (*send_on_channel_finish)(FlBinaryMessenger* messenger,
|
||||
GAsyncResult* result,
|
||||
GError** error);
|
||||
};
|
||||
|
||||
struct _FlBinaryMessengerResponseHandleClass {
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
/**
|
||||
* FlBinaryMessenger:
|
||||
*
|
||||
* #FlBinaryMessenger is an object that allows sending and receiving of platform
|
||||
* messages with an #FlEngine.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlBinaryMessengerResponseHandle:
|
||||
*
|
||||
* #FlBinaryMessengerResponseHandle is an object used to send responses with.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_binary_messenger_set_platform_message_handler:
|
||||
* @binary_messenger: an #FlBinaryMessenger.
|
||||
* @channel: channel to listen on.
|
||||
* @handler: (allow-none): function to call when a message is received on this
|
||||
* channel or %NULL to disable a handler
|
||||
* @user_data: (closure): user data to pass to @handler.
|
||||
* @destroy_notify: (allow-none): a function which gets called to free
|
||||
* @user_data, or %NULL.
|
||||
*
|
||||
* Sets the function called when a platform message is received on the given
|
||||
* channel. See #FlBinaryMessengerMessageHandler for details on how to respond
|
||||
* to messages.
|
||||
*
|
||||
* The handler is removed if the channel is closed or is replaced by another
|
||||
* handler, set @destroy_notify if you want to detect this.
|
||||
*/
|
||||
void fl_binary_messenger_set_message_handler_on_channel(
|
||||
FlBinaryMessenger* messenger,
|
||||
const gchar* channel,
|
||||
FlBinaryMessengerMessageHandler handler,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
/**
|
||||
* fl_binary_messenger_send_response:
|
||||
* @binary_messenger: an #FlBinaryMessenger.
|
||||
* @response_handle: handle that was provided in a
|
||||
* #FlBinaryMessengerMessageHandler.
|
||||
* @response: (allow-none): response to send or %NULL for an empty response.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Responds to a platform message.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_binary_messenger_send_response(
|
||||
FlBinaryMessenger* messenger,
|
||||
FlBinaryMessengerResponseHandle* response_handle,
|
||||
GBytes* response,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_binary_messenger_send_on_channel:
|
||||
* @binary_messenger: an #FlBinaryMessenger.
|
||||
* @channel: channel to send to.
|
||||
* @message: (allow-none): message buffer to send or %NULL for an empty message.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @callback: (scope async): a #GAsyncReadyCallback to call when the request is
|
||||
* satisfied.
|
||||
* @user_data: (closure): user data to pass to @callback.
|
||||
*
|
||||
* Asynchronously sends a platform message.
|
||||
*/
|
||||
void fl_binary_messenger_send_on_channel(FlBinaryMessenger* messenger,
|
||||
const gchar* channel,
|
||||
GBytes* message,
|
||||
GCancellable* cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_binary_messenger_send_on_channel_finish:
|
||||
* @binary_messenger: an #FlBinaryMessenger.
|
||||
* @result: a #GAsyncResult.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Completes request started with fl_binary_messenger_send_on_channel().
|
||||
*
|
||||
* Returns: (transfer full): message response on success or %NULL on error.
|
||||
*/
|
||||
GBytes* fl_binary_messenger_send_on_channel_finish(FlBinaryMessenger* messenger,
|
||||
GAsyncResult* result,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_MESSENGER_H_
|
||||
@@ -1,125 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_DART_PROJECT_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_DART_PROJECT_H_
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlDartProject, fl_dart_project, FL, DART_PROJECT, GObject)
|
||||
|
||||
/**
|
||||
* FlDartProject:
|
||||
*
|
||||
* #FlDartProject represents a Dart project. It is used to provide information
|
||||
* about the application when creating an #FlView.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_dart_project_new:
|
||||
*
|
||||
* Creates a Flutter project for the currently running executable. The following
|
||||
* data files are required relative to the location of the executable:
|
||||
* - data/flutter_assets/ (as built by the Flutter tool).
|
||||
* - data/icudtl.dat (provided as a resource by the Flutter tool).
|
||||
* - lib/libapp.so (as built by the Flutter tool when in AOT mode).
|
||||
*
|
||||
* Returns: a new #FlDartProject.
|
||||
*/
|
||||
FlDartProject* fl_dart_project_new();
|
||||
|
||||
/**
|
||||
* fl_dart_project_set_enable_mirrors:
|
||||
* @project: an #FlDartProject.
|
||||
* @enable_mirrors: %TRUE if the dart:mirrors library should be used.
|
||||
*
|
||||
* Sets if this Flutter project can use the dart:mirrors library.
|
||||
*
|
||||
* Deprecated: This function is temporary and will be removed in a future
|
||||
* release.
|
||||
*/
|
||||
void fl_dart_project_set_enable_mirrors(FlDartProject* project,
|
||||
gboolean enable_mirrors) G_DEPRECATED;
|
||||
|
||||
/**
|
||||
* fl_dart_project_get_enable_mirrors:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Gets if this Flutter project can use the dart:mirrors library.
|
||||
*
|
||||
* Returns: %TRUE if the dart:mirrors library can be used.
|
||||
*
|
||||
* Deprecated: This function is temporary and will be removed in a future
|
||||
* release.
|
||||
*/
|
||||
gboolean fl_dart_project_get_enable_mirrors(FlDartProject* project)
|
||||
G_DEPRECATED;
|
||||
|
||||
/**
|
||||
* fl_dart_project_get_aot_library_path:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Gets the path to the AOT library in the Flutter application.
|
||||
*
|
||||
* Returns: (type filename): an absolute file path, e.g.
|
||||
* "/projects/my_dart_project/lib/libapp.so".
|
||||
*/
|
||||
const gchar* fl_dart_project_get_aot_library_path(FlDartProject* project);
|
||||
|
||||
/**
|
||||
* fl_dart_project_get_assets_path:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Gets the path to the directory containing the assets used in the Flutter
|
||||
* application.
|
||||
*
|
||||
* Returns: (type filename): an absolute directory path, e.g.
|
||||
* "/projects/my_dart_project/data/flutter_assets".
|
||||
*/
|
||||
const gchar* fl_dart_project_get_assets_path(FlDartProject* project);
|
||||
|
||||
/**
|
||||
* fl_dart_project_get_icu_data_path:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Gets the path to the ICU data file in the Flutter application.
|
||||
*
|
||||
* Returns: (type filename): an absolute file path, e.g.
|
||||
* "/projects/my_dart_project/data/icudtl.dat".
|
||||
*/
|
||||
const gchar* fl_dart_project_get_icu_data_path(FlDartProject* project);
|
||||
|
||||
/**
|
||||
* fl_dart_project_set_dart_entrypoint_arguments:
|
||||
* @project: an #FlDartProject.
|
||||
* @argv: a pointer to a NULL-terminated array of C strings containing the
|
||||
* command line arguments.
|
||||
*
|
||||
* Sets the command line arguments to be passed through to the Dart
|
||||
* entrypoint function.
|
||||
*/
|
||||
void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject* project,
|
||||
char** argv);
|
||||
|
||||
/**
|
||||
* fl_dart_project_get_dart_entrypoint_arguments:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Gets the command line arguments to be passed through to the Dart entrypoint
|
||||
* function.
|
||||
*
|
||||
* Returns: a NULL-terminated array of strings containing the command line
|
||||
* arguments to be passed to the Dart entrypoint.
|
||||
*/
|
||||
gchar** fl_dart_project_get_dart_entrypoint_arguments(FlDartProject* project);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_DART_PROJECT_H_
|
||||
@@ -1,60 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_binary_messenger.h"
|
||||
#include "fl_dart_project.h"
|
||||
#include "fl_texture_registrar.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlEngine, fl_engine, FL, ENGINE, GObject)
|
||||
|
||||
/**
|
||||
* FlEngine:
|
||||
*
|
||||
* #FlEngine is an object that contains a running Flutter engine.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_engine_new_headless:
|
||||
* @project: an #FlDartProject.
|
||||
*
|
||||
* Creates new Flutter engine running in headless mode.
|
||||
*
|
||||
* Returns: a new #FlEngine.
|
||||
*/
|
||||
FlEngine* fl_engine_new_headless(FlDartProject* project);
|
||||
|
||||
/**
|
||||
* fl_engine_get_binary_messenger:
|
||||
* @engine: an #FlEngine.
|
||||
*
|
||||
* Gets the messenger to communicate with this engine.
|
||||
*
|
||||
* Returns: an #FlBinaryMessenger.
|
||||
*/
|
||||
FlBinaryMessenger* fl_engine_get_binary_messenger(FlEngine* engine);
|
||||
|
||||
/**
|
||||
* fl_engine_get_texture_registrar:
|
||||
* @engine: an #FlEngine.
|
||||
*
|
||||
* Gets the texture registrar for registering textures.
|
||||
*
|
||||
* Returns: an #FlTextureRegistrar.
|
||||
*/
|
||||
FlTextureRegistrar* fl_engine_get_texture_registrar(FlEngine* engine);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_H_
|
||||
@@ -1,187 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_EVENT_CHANNEL_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_EVENT_CHANNEL_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_binary_messenger.h"
|
||||
#include "fl_method_channel.h"
|
||||
#include "fl_method_response.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlEventChannel,
|
||||
fl_event_channel,
|
||||
FL,
|
||||
EVENT_CHANNEL,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlEventChannel:
|
||||
*
|
||||
* #FlEventChannel is an object that allows sending
|
||||
* an events stream to Dart code over platform channels.
|
||||
*
|
||||
* The following example shows how to send events on a channel:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* static FlEventChannel *channel = NULL;
|
||||
* static gboolean send_events = FALSE;
|
||||
*
|
||||
* static void event_occurs_cb (FooEvent *event) {
|
||||
* if (send_events) {
|
||||
* g_autoptr(FlValue) message = foo_event_to_value (event);
|
||||
* g_autoptr(GError) error = NULL;
|
||||
* if (!fl_event_channel_send (channel, message, NULL, &error)) {
|
||||
* g_warning ("Failed to send event: %s", error->message);
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* static FlMethodErrorResponse* listen_cb (FlEventChannel* channel,
|
||||
* FlValue *args,
|
||||
* gpointer user_data) {
|
||||
* send_events = TRUE;
|
||||
* return NULL;
|
||||
* }
|
||||
*
|
||||
* static FlMethodErrorResponse* cancel_cb (GObject *object,
|
||||
* FlValue *args,
|
||||
* gpointer user_data) {
|
||||
* send_events = FALSE;
|
||||
* return NULL;
|
||||
* }
|
||||
*
|
||||
* static void setup_channel () {
|
||||
* g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new ();
|
||||
* channel = fl_event_channel_new (messenger, "flutter/foo",
|
||||
* FL_METHOD_CODEC (codec));
|
||||
* fl_event_channel_set_stream_handlers (channel, listen_cb, cancel_cb,
|
||||
* NULL, NULL);
|
||||
* }
|
||||
* ]|
|
||||
*
|
||||
* #FlEventChannel matches the EventChannel class in the Flutter
|
||||
* services library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlEventChannelHandler:
|
||||
* @channel: an #FlEventChannel.
|
||||
* @args: arguments passed from the Dart end of the channel.
|
||||
* @user_data: (closure): data provided when registering this handler.
|
||||
*
|
||||
* Function called when the stream is listened to or cancelled.
|
||||
*
|
||||
* Returns: (transfer full): an #FlMethodErrorResponse or %NULL if no error.
|
||||
*/
|
||||
typedef FlMethodErrorResponse* (*FlEventChannelHandler)(FlEventChannel* channel,
|
||||
FlValue* args,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_event_channel_new:
|
||||
* @messenger: an #FlBinaryMessenger.
|
||||
* @name: a channel name.
|
||||
* @codec: the message codec.
|
||||
*
|
||||
* Creates an event channel. @codec must match the codec used on the Dart
|
||||
* end of the channel.
|
||||
*
|
||||
* Returns: a new #FlEventChannel.
|
||||
*/
|
||||
FlEventChannel* fl_event_channel_new(FlBinaryMessenger* messenger,
|
||||
const gchar* name,
|
||||
FlMethodCodec* codec);
|
||||
|
||||
/**
|
||||
* fl_event_channel_set_stream_handlers:
|
||||
* @channel: an #FlEventChannel.
|
||||
* @listen_handler: (allow-none): function to call when the Dart side of the
|
||||
* channel starts listening to the stream.
|
||||
* @cancel_handler: (allow-none): function to call when the Dart side of the
|
||||
* channel cancels their subscription to the stream.
|
||||
* @user_data: (closure): user data to pass to @listen_handler and
|
||||
* @cancel_handler.
|
||||
* @destroy_notify: (allow-none): a function which gets called to free
|
||||
* @user_data, or %NULL.
|
||||
*
|
||||
* Sets the functions called when the Dart side requests the stream to start and
|
||||
* finish.
|
||||
*
|
||||
* The handlers are removed if the channel is closed or is replaced by another
|
||||
* handler, set @destroy_notify if you want to detect this.
|
||||
*/
|
||||
void fl_event_channel_set_stream_handlers(FlEventChannel* channel,
|
||||
FlEventChannelHandler listen_handler,
|
||||
FlEventChannelHandler cancel_handler,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
/**
|
||||
* fl_event_channel_send:
|
||||
* @channel: an #FlEventChannel.
|
||||
* @event: event to send, must match what the #FlMethodCodec supports.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Sends an event on the channel.
|
||||
* Events should only be sent once the channel is being listened to.
|
||||
*
|
||||
* Returns: %TRUE if successful.
|
||||
*/
|
||||
gboolean fl_event_channel_send(FlEventChannel* channel,
|
||||
FlValue* event,
|
||||
GCancellable* cancellable,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_event_channel_send_error:
|
||||
* @channel: an #FlEventChannel.
|
||||
* @code: error code to send.
|
||||
* @message: error message to send.
|
||||
* @details: (allow-none): error details or %NULL.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Sends an error on the channel.
|
||||
* Errors should only be sent once the channel is being listened to.
|
||||
*
|
||||
* Returns: %TRUE if successful.
|
||||
*/
|
||||
gboolean fl_event_channel_send_error(FlEventChannel* channel,
|
||||
const gchar* code,
|
||||
const gchar* message,
|
||||
FlValue* details,
|
||||
GCancellable* cancellable,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_event_channel_send_end_of_stream:
|
||||
* @channel: an #FlEventChannel.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Indicates the stream has completed.
|
||||
* It is a programmer error to send any more events after calling this.
|
||||
*
|
||||
* Returns: %TRUE if successful.
|
||||
*/
|
||||
gboolean fl_event_channel_send_end_of_stream(FlEventChannel* channel,
|
||||
GCancellable* cancellable,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_EVENT_CHANNEL_H_
|
||||
@@ -1,96 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_MESSAGE_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_MESSAGE_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_message_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* FlJsonMessageCodecError:
|
||||
* @FL_JSON_MESSAGE_CODEC_ERROR_INVALID_UTF8: Message is not valid UTF-8.
|
||||
* @FL_JSON_MESSAGE_CODEC_ERROR_INVALID_JSON: Message is not valid JSON.
|
||||
* @FL_JSON_MESSAGE_CODEC_ERROR_INVALID_OBJECT_KEY_TYPE: Invalid object key
|
||||
* type.
|
||||
*
|
||||
* Errors for #FlJsonMessageCodec objects to set on failures.
|
||||
*/
|
||||
#define FL_JSON_MESSAGE_CODEC_ERROR fl_json_message_codec_error_quark()
|
||||
|
||||
typedef enum {
|
||||
FL_JSON_MESSAGE_CODEC_ERROR_INVALID_UTF8,
|
||||
FL_JSON_MESSAGE_CODEC_ERROR_INVALID_JSON,
|
||||
FL_JSON_MESSAGE_CODEC_ERROR_INVALID_OBJECT_KEY_TYPE,
|
||||
} FlJsonMessageCodecError;
|
||||
|
||||
GQuark fl_json_message_codec_error_quark(void) G_GNUC_CONST;
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlJsonMessageCodec,
|
||||
fl_json_message_codec,
|
||||
FL,
|
||||
JSON_CODEC,
|
||||
FlMessageCodec)
|
||||
|
||||
/**
|
||||
* FlJsonMessageCodec:
|
||||
*
|
||||
* #FlJsonMessageCodec is an #FlMessageCodec that implements the encodes
|
||||
* #FlValue to/from JSON. This codec encodes and decodes #FlValue of type
|
||||
* #FL_VALUE_TYPE_NULL, #FL_VALUE_TYPE_BOOL, #FL_VALUE_TYPE_INT,
|
||||
* #FL_VALUE_TYPE_FLOAT, #FL_VALUE_TYPE_STRING, #FL_VALUE_TYPE_UINT8_LIST,
|
||||
* #FL_VALUE_TYPE_INT32_LIST, #FL_VALUE_TYPE_INT64_LIST,
|
||||
* #FL_VALUE_TYPE_FLOAT_LIST, #FL_VALUE_TYPE_LIST, and #FL_VALUE_TYPE_MAP.
|
||||
*
|
||||
* #FlJsonMessageCodec matches the JSONMessageCodec class in the Flutter
|
||||
* services library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_json_message_codec_new:
|
||||
*
|
||||
* Creates an #FlJsonMessageCodec.
|
||||
*
|
||||
* Returns: a new #FlJsonMessageCodec.
|
||||
*/
|
||||
FlJsonMessageCodec* fl_json_message_codec_new();
|
||||
|
||||
/**
|
||||
* fl_json_message_codec_encode:
|
||||
* @codec: an #FlJsonMessageCodec.
|
||||
* @value: value to encode.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Encodes a value to a JSON string.
|
||||
*
|
||||
* Returns: a JSON representation of this value or %NULL on error.
|
||||
*/
|
||||
gchar* fl_json_message_codec_encode(FlJsonMessageCodec* codec,
|
||||
FlValue* value,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_json_message_codec_decode:
|
||||
* @codec: an #FlJsonMessageCodec.
|
||||
* @text: UTF-8 text in JSON format.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Decodes a value from a JSON string.
|
||||
*
|
||||
* Returns: an #FlValue or %NULL on error.
|
||||
*/
|
||||
FlValue* fl_json_message_codec_decode(FlJsonMessageCodec* codec,
|
||||
const gchar* text,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_MESSAGE_CODEC_H_
|
||||
@@ -1,44 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_METHOD_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_METHOD_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_method_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlJsonMethodCodec,
|
||||
fl_json_method_codec,
|
||||
FL,
|
||||
JSON_METHOD_CODEC,
|
||||
FlMethodCodec)
|
||||
|
||||
/**
|
||||
* FlJsonMethodCodec:
|
||||
*
|
||||
* #FlJsonMessageCodec is an #FlMethodCodec that implements method calls using
|
||||
* the Flutter JSON message encoding. It should be used with an
|
||||
* #FlMethodChannel.
|
||||
*
|
||||
* #FlJsonMethodCodec matches the JSONMethodCodec class in the Flutter services
|
||||
* library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_json_method_codec_new:
|
||||
*
|
||||
* Creates an #FlJsonMethodCodec.
|
||||
*
|
||||
* Returns: a new #FlJsonMethodCodec.
|
||||
*/
|
||||
FlJsonMethodCodec* fl_json_method_codec_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_JSON_METHOD_CODEC_H_
|
||||
@@ -1,129 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_MESSAGE_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_MESSAGE_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_value.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* FlMessageCodecError:
|
||||
* @FL_MESSAGE_CODEC_ERROR_FAILED: Codec failed due to an unspecified error.
|
||||
* @FL_MESSAGE_CODEC_ERROR_OUT_OF_DATA: Codec ran out of data reading a value.
|
||||
* @FL_MESSAGE_CODEC_ERROR_ADDITIONAL_DATA: Additional data encountered in
|
||||
* message.
|
||||
* @FL_MESSAGE_CODEC_ERROR_UNSUPPORTED_TYPE: Codec encountered an unsupported
|
||||
* #FlValue.
|
||||
*
|
||||
* Errors for #FlMessageCodec objects to set on failures.
|
||||
*/
|
||||
#define FL_MESSAGE_CODEC_ERROR fl_message_codec_error_quark()
|
||||
|
||||
typedef enum {
|
||||
FL_MESSAGE_CODEC_ERROR_FAILED,
|
||||
FL_MESSAGE_CODEC_ERROR_OUT_OF_DATA,
|
||||
FL_MESSAGE_CODEC_ERROR_ADDITIONAL_DATA,
|
||||
FL_MESSAGE_CODEC_ERROR_UNSUPPORTED_TYPE,
|
||||
} FlMessageCodecError;
|
||||
|
||||
GQuark fl_message_codec_error_quark(void) G_GNUC_CONST;
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlMessageCodec,
|
||||
fl_message_codec,
|
||||
FL,
|
||||
MESSAGE_CODEC,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlMessageCodec:
|
||||
*
|
||||
* #FlMessageCodec is a message encoding/decoding mechanism that operates on
|
||||
* #FlValue objects. Both operations returns errors if the conversion fails.
|
||||
* Such situations should be treated as programming errors.
|
||||
*
|
||||
* #FlMessageCodec matches the MethodCodec class in the Flutter services
|
||||
* library.
|
||||
*/
|
||||
|
||||
struct _FlMessageCodecClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
/**
|
||||
* FlMessageCodec::encode_message:
|
||||
* @codec: A #FlMessageCodec.
|
||||
* @message: message to encode or %NULL to encode the null value.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Virtual method to encode a message. A subclass must implement this method.
|
||||
* If the subclass cannot handle the type of @message then it must generate a
|
||||
* FL_MESSAGE_CODEC_ERROR_UNSUPPORTED_TYPE error.
|
||||
*
|
||||
* Returns: a binary message or %NULL on error.
|
||||
*/
|
||||
GBytes* (*encode_message)(FlMessageCodec* codec,
|
||||
FlValue* message,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* FlMessageCodec::decode_message:
|
||||
* @codec: an #FlMessageCodec.
|
||||
* @message: binary message to decode.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Virtual method to decode a message. A subclass must implement this method.
|
||||
* If @message is too small then a #FL_MESSAGE_CODEC_ERROR_OUT_OF_DATA error
|
||||
* must be generated. If @message is too large then a
|
||||
* #FL_MESSAGE_CODEC_ERROR_ADDITIONAL_DATA error must be generated.
|
||||
*
|
||||
* Returns: an #FlValue or %NULL on error.
|
||||
*/
|
||||
FlValue* (*decode_message)(FlMessageCodec* codec,
|
||||
GBytes* message,
|
||||
GError** error);
|
||||
};
|
||||
|
||||
/**
|
||||
* fl_message_codec_encode_message:
|
||||
* @codec: an #FlMessageCodec.
|
||||
* @buffer: buffer to write to.
|
||||
* @message: message to encode or %NULL to encode the null value.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Encodes a message into a binary representation.
|
||||
*
|
||||
* Returns: a binary encoded message or %NULL on error.
|
||||
*/
|
||||
GBytes* fl_message_codec_encode_message(FlMessageCodec* codec,
|
||||
FlValue* message,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_message_codec_decode_message:
|
||||
* @codec: an #FlMessageCodec.
|
||||
* @message: binary message to decode.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Decodes a message from a binary encoding.
|
||||
*
|
||||
* Returns: an #FlValue or %NULL on error.
|
||||
*/
|
||||
FlValue* fl_message_codec_decode_message(FlMessageCodec* codec,
|
||||
GBytes* message,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_MESSAGE_CODEC_H_
|
||||
@@ -1,115 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CALL_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CALL_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_method_response.h"
|
||||
#include "fl_value.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlMethodCall, fl_method_call, FL, METHOD_CALL, GObject)
|
||||
|
||||
/**
|
||||
* FlMethodCall:
|
||||
*
|
||||
* #FlMethodCall represents and incoming method call as returned by an
|
||||
* #FlMethodChannel.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_method_call_get_name:
|
||||
* @method_call: an #FlMethodCall.
|
||||
*
|
||||
* Gets the name of the method call.
|
||||
*
|
||||
* Returns: a method name.
|
||||
*/
|
||||
const gchar* fl_method_call_get_name(FlMethodCall* method_call);
|
||||
|
||||
/**
|
||||
* fl_method_call_get_args:
|
||||
* @method_call: an #FlMethodCall.
|
||||
*
|
||||
* Gets the arguments passed to the method.
|
||||
*
|
||||
* Returns: an #FlValue.
|
||||
*/
|
||||
FlValue* fl_method_call_get_args(FlMethodCall* method_call);
|
||||
|
||||
/**
|
||||
* fl_method_call_respond:
|
||||
* @method_call: an #FlMethodCall.
|
||||
* @response: an #FlMethodResponse.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Responds to a method call.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_method_call_respond(FlMethodCall* method_call,
|
||||
FlMethodResponse* response,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_method_call_respond_success:
|
||||
* @method_call: an #FlMethodCall.
|
||||
* @result: (allow-none): value to respond with, must match what the
|
||||
* #FlMethodCodec supports.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Convenience method that responds to method call with
|
||||
* #FlMethodSuccessResponse.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_method_call_respond_success(FlMethodCall* method_call,
|
||||
FlValue* result,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_method_call_respond_error:
|
||||
* @method_call: an #FlMethodCall.
|
||||
* @code: error code.
|
||||
* @message: (allow-none): error message.
|
||||
* @details: (allow-none): details for the error.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Convenience method that responds to method call with #FlMethodErrorResponse.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_method_call_respond_error(FlMethodCall* method_call,
|
||||
const gchar* code,
|
||||
const gchar* message,
|
||||
FlValue* details,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_method_call_respond_not_implemented:
|
||||
* @method_call: an #FlMethodCall.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Convenience method that responds to method call with
|
||||
* #FlMethodNotImplementedResponse.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_method_call_respond_not_implemented(FlMethodCall* method_call,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CALL_H_
|
||||
@@ -1,190 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CHANNEL_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CHANNEL_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_binary_messenger.h"
|
||||
#include "fl_method_call.h"
|
||||
#include "fl_method_codec.h"
|
||||
#include "fl_method_response.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlMethodChannel,
|
||||
fl_method_channel,
|
||||
FL,
|
||||
METHOD_CHANNEL,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlMethodChannel:
|
||||
*
|
||||
* #FlMethodChannel is an object that allows method calls to and from Dart code.
|
||||
*
|
||||
* The following example shows how to call and handle methods on a channel.
|
||||
* See #FlMethodResponse for how to handle errors in more detail.
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* static FlMethodChannel *channel = NULL;
|
||||
*
|
||||
* static void method_call_cb (FlMethodChannel* channel,
|
||||
* FlMethodCall* method_call,
|
||||
* gpointer user_data) {
|
||||
* g_autoptr(FlMethodResponse) response = NULL;
|
||||
* if (strcmp (fl_method_call_get_name (method_call), "Foo.bar") == 0) {
|
||||
* g_autoptr(GError) bar_error = NULL;
|
||||
* g_autoptr(FlValue) result =
|
||||
* do_bar (fl_method_call_get_args (method_call), &bar_error);
|
||||
* if (result == NULL)
|
||||
* response =
|
||||
* FL_METHOD_RESPONSE (fl_method_error_response_new ("bar error",
|
||||
* bar_error->message));
|
||||
* else
|
||||
* response = FL_METHOD_RESPONSE (fl_method_success_response_new
|
||||
* (result)); } else response = FL_METHOD_RESPONSE
|
||||
* (fl_method_not_implemented_response_new ());
|
||||
*
|
||||
* g_autoptr(GError) error = NULL;
|
||||
* if (!fl_method_call_respond(method_call, response))
|
||||
* g_warning ("Failed to send response: %s", error->message);
|
||||
* }
|
||||
*
|
||||
* static void method_response_cb(GObject *object,
|
||||
* GAsyncResult *result,
|
||||
* gpointer user_data) {
|
||||
* g_autoptr(GError) error = NULL;
|
||||
* g_autoptr(FlMethodResponse) response =
|
||||
* fl_method_channel_invoke_method_finish (FL_METHOD_CODEC (object), result,
|
||||
* &error);
|
||||
* if (response == NULL) {
|
||||
* g_warning ("Failed to call method: %s", error->message);
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* g_autoptr(FlValue) value =
|
||||
* fl_method_response_get_result (response, &error);
|
||||
* if (response == NULL) {
|
||||
* g_warning ("Method returned error: %s", error->message);
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* use_result (value);
|
||||
* }
|
||||
*
|
||||
* static void call_method () {
|
||||
* g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new ();
|
||||
* channel =
|
||||
* fl_method_channel_new(messenger, "flutter/foo", FL_METHOD_CODEC (codec));
|
||||
* fl_method_channel_set_method_call_handler (channel, method_call_cb, NULL,
|
||||
* NULL);
|
||||
*
|
||||
* g_autoptr(FlValue) args = fl_value_new_string ("Hello World");
|
||||
* fl_method_channel_invoke_method (channel, "Foo.foo", args,
|
||||
* cancellable, method_response_cb, NULL);
|
||||
* }
|
||||
* ]|
|
||||
*
|
||||
* #FlMethodChannel matches the MethodChannel class in the Flutter services
|
||||
* library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlMethodChannelMethodCallHandler:
|
||||
* @channel: an #FlMethodChannel.
|
||||
* @method_call: an #FlMethodCall.
|
||||
* @user_data: (closure): data provided when registering this handler.
|
||||
*
|
||||
* Function called when a method call is received. Respond to the method call
|
||||
* with fl_method_call_respond(). If the response is not occurring in this
|
||||
* callback take a reference to @method_call and release that once it has been
|
||||
* responded to. Failing to respond before the last reference to @method_call is
|
||||
* dropped is a programming error.
|
||||
*/
|
||||
typedef void (*FlMethodChannelMethodCallHandler)(FlMethodChannel* channel,
|
||||
FlMethodCall* method_call,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_method_channel_new:
|
||||
* @messenger: an #FlBinaryMessenger.
|
||||
* @name: a channel name.
|
||||
* @codec: the method codec.
|
||||
*
|
||||
* Creates a new method channel. @codec must match the codec used on the Dart
|
||||
* end of the channel.
|
||||
*
|
||||
* Returns: a new #FlMethodChannel.
|
||||
*/
|
||||
FlMethodChannel* fl_method_channel_new(FlBinaryMessenger* messenger,
|
||||
const gchar* name,
|
||||
FlMethodCodec* codec);
|
||||
|
||||
/**
|
||||
* fl_method_channel_set_method_call_handler:
|
||||
* @channel: an #FlMethodChannel.
|
||||
* @handler: function to call when a method call is received on this channel.
|
||||
* @user_data: (closure): user data to pass to @handler.
|
||||
* @destroy_notify: (allow-none): a function which gets called to free
|
||||
* @user_data, or %NULL.
|
||||
*
|
||||
* Sets the function called when a method call is received from the Dart side of
|
||||
* the channel. See #FlMethodChannelMethodCallHandler for details on how to
|
||||
* respond to method calls.
|
||||
*
|
||||
* The handler is removed if the channel is closed or is replaced by another
|
||||
* handler, set @destroy_notify if you want to detect this.
|
||||
*/
|
||||
void fl_method_channel_set_method_call_handler(
|
||||
FlMethodChannel* channel,
|
||||
FlMethodChannelMethodCallHandler handler,
|
||||
gpointer user_data,
|
||||
GDestroyNotify destroy_notify);
|
||||
|
||||
/**
|
||||
* fl_method_channel_invoke_method:
|
||||
* @channel: an #FlMethodChannel.
|
||||
* @method: the method to call.
|
||||
* @args: (allow-none): arguments to the method, must match what the
|
||||
* #FlMethodCodec supports.
|
||||
* @cancellable: (allow-none): a #GCancellable or %NULL.
|
||||
* @callback: (scope async): (allow-none): a #GAsyncReadyCallback to call when
|
||||
* the request is satisfied or %NULL to ignore the response.
|
||||
* @user_data: (closure): user data to pass to @callback.
|
||||
*
|
||||
* Calls a method on this channel.
|
||||
*/
|
||||
void fl_method_channel_invoke_method(FlMethodChannel* channel,
|
||||
const gchar* method,
|
||||
FlValue* args,
|
||||
GCancellable* cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* fl_method_channel_invoke_method_finish:
|
||||
* @channel: an #FlMethodChannel.
|
||||
* @result: #GAsyncResult.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Completes request started with fl_method_channel_invoke_method().
|
||||
*
|
||||
* Returns: (transfer full): an #FlMethodResponse or %NULL on error.
|
||||
*/
|
||||
FlMethodResponse* fl_method_channel_invoke_method_finish(
|
||||
FlMethodChannel* channel,
|
||||
GAsyncResult* result,
|
||||
GError** error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CHANNEL_H_
|
||||
@@ -1,131 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_method_response.h"
|
||||
#include "fl_value.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlMethodCodec,
|
||||
fl_method_codec,
|
||||
FL,
|
||||
METHOD_CODEC,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlMethodCodec:
|
||||
*
|
||||
* #FlMethodCodec is an abstract class that encodes and decodes method calls on
|
||||
* a platform channel. Override this class to implement an encoding.
|
||||
*
|
||||
* #FlMethodCodec matches the MethodCodec class in the Flutter services
|
||||
* library.
|
||||
*/
|
||||
|
||||
struct _FlMethodCodecClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
/**
|
||||
* FlMethodCodec::encode_method_call:
|
||||
* @codec: an #FlMethodCodec.
|
||||
* @name: method name.
|
||||
* @args: (allow-none): method arguments, or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Encodes a method call.
|
||||
*
|
||||
* Returns: (transfer full): a binary encoding of this method call or %NULL if
|
||||
* not able to encode.
|
||||
*/
|
||||
GBytes* (*encode_method_call)(FlMethodCodec* codec,
|
||||
const gchar* name,
|
||||
FlValue* args,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* FlMethodCodec::decode_method_call:
|
||||
* @codec: an #FlMethodCodec
|
||||
* @message: message to decode.
|
||||
* @name: (transfer full): location to write method name or %NULL if not
|
||||
* required
|
||||
* @args: (transfer full): location to write method arguments, or %NULL if not
|
||||
* required
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL
|
||||
*
|
||||
* Decodes a method call.
|
||||
*
|
||||
* Returns: %TRUE if successfully decoded.
|
||||
*/
|
||||
gboolean (*decode_method_call)(FlMethodCodec* codec,
|
||||
GBytes* message,
|
||||
gchar** name,
|
||||
FlValue** args,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* FlMethodCodec::encode_success_envelope:
|
||||
* @codec: an #FlMethodCodec.
|
||||
* @result: (allow-none): method result, or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Encodes a successful response to a method call.
|
||||
*
|
||||
* Returns: (transfer full): a binary encoding of this response or %NULL if
|
||||
* not able to encode.
|
||||
*/
|
||||
GBytes* (*encode_success_envelope)(FlMethodCodec* codec,
|
||||
FlValue* result,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* FlMethodCodec::encode_error_envelope:
|
||||
* @codec: an #FlMethodCodec.
|
||||
* @code: an error code.
|
||||
* @message: (allow-none): an error message, or %NULL.
|
||||
* @details: (allow-none): error details, or %NULL.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Encodes an error response to a method call.
|
||||
*
|
||||
* Returns: (transfer full): a binary encoding of this response or %NULL if
|
||||
* not able to encode.
|
||||
*/
|
||||
GBytes* (*encode_error_envelope)(FlMethodCodec* codec,
|
||||
const gchar* code,
|
||||
const gchar* message,
|
||||
FlValue* details,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* FlMethodCodec::decode_response:
|
||||
* @codec: an #FlMethodCodec.
|
||||
* @message: message to decode.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL.
|
||||
*
|
||||
* Decodes a response to a method call.
|
||||
*
|
||||
* Returns: a new #FlMethodResponse or %NULL on error.
|
||||
*/
|
||||
FlMethodResponse* (*decode_response)(FlMethodCodec* codec,
|
||||
GBytes* message,
|
||||
GError** error);
|
||||
};
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_CODEC_H_
|
||||
@@ -1,212 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_RESPONSE_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_RESPONSE_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_value.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* FlMethodResponseError:
|
||||
* @FL_METHOD_RESPONSE_ERROR_FAILED: Call failed due to an unspecified error.
|
||||
* @FL_METHOD_RESPONSE_ERROR_REMOTE_ERROR: An error was returned by the other
|
||||
* side of the channel.
|
||||
* @FL_METHOD_RESPONSE_ERROR_NOT_IMPLEMENTED: The requested method is not
|
||||
* implemented.
|
||||
*
|
||||
* Errors set by `fl_method_response_get_result` when the method call response
|
||||
* is not #FlMethodSuccessResponse.
|
||||
*/
|
||||
#define FL_METHOD_RESPONSE_ERROR fl_method_response_error_quark()
|
||||
|
||||
typedef enum {
|
||||
FL_METHOD_RESPONSE_ERROR_FAILED,
|
||||
FL_METHOD_RESPONSE_ERROR_REMOTE_ERROR,
|
||||
FL_METHOD_RESPONSE_ERROR_NOT_IMPLEMENTED,
|
||||
} FlMethodResponseError;
|
||||
|
||||
GQuark fl_method_response_error_quark(void) G_GNUC_CONST;
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlMethodResponse,
|
||||
fl_method_response,
|
||||
FL,
|
||||
METHOD_RESPONSE,
|
||||
GObject)
|
||||
|
||||
struct _FlMethodResponseClass {
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlMethodSuccessResponse,
|
||||
fl_method_success_response,
|
||||
FL,
|
||||
METHOD_SUCCESS_RESPONSE,
|
||||
FlMethodResponse)
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlMethodErrorResponse,
|
||||
fl_method_error_response,
|
||||
FL,
|
||||
METHOD_ERROR_RESPONSE,
|
||||
FlMethodResponse)
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlMethodNotImplementedResponse,
|
||||
fl_method_not_implemented_response,
|
||||
FL,
|
||||
METHOD_NOT_IMPLEMENTED_RESPONSE,
|
||||
FlMethodResponse)
|
||||
|
||||
/**
|
||||
* FlMethodResponse:
|
||||
*
|
||||
* #FlMethodResponse contains the information returned when an #FlMethodChannel
|
||||
* method call returns. If you expect the method call to be successful use
|
||||
* fl_method_response_get_result(). If you want to handle error cases then you
|
||||
* should use code like:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* if (FL_IS_METHOD_SUCCESS_RESPONSE (response)) {
|
||||
* FlValue *result =
|
||||
* fl_method_success_response_get_result(
|
||||
* FL_METHOD_SUCCESS_RESPONSE (response));
|
||||
* handle_result (result);
|
||||
* } else if (FL_IS_METHOD_ERROR_RESPONSE (response)) {
|
||||
* FlMethodErrorResponse *error_response =
|
||||
* FL_METHOD_ERROR_RESPONSE (response);
|
||||
* handle_error (fl_method_error_response_get_code (error_response),
|
||||
* fl_method_error_response_get_message (error_response),
|
||||
* fl_method_error_response_get_details (error_response));
|
||||
* }
|
||||
* else if (FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE (response)) {
|
||||
* handle_not_implemented ();
|
||||
* }
|
||||
* }
|
||||
* ]|
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlMethodSuccessResponse:
|
||||
*
|
||||
* #FlMethodSuccessResponse is the #FlMethodResponse returned when a method call
|
||||
* has successfully completed. The result of the method call is obtained using
|
||||
* `fl_method_success_response_get_result`.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlMethodErrorResponse:
|
||||
*
|
||||
* #FlMethodErrorResponse is the #FlMethodResponse returned when a method call
|
||||
* results in an error. The error details are obtained using
|
||||
* `fl_method_error_response_get_code`, `fl_method_error_response_get_message`
|
||||
* and `fl_method_error_response_get_details`.
|
||||
*/
|
||||
|
||||
/**
|
||||
* FlMethodNotImplementedResponse:
|
||||
*
|
||||
* #FlMethodNotImplementedResponse is the #FlMethodResponse returned when a
|
||||
* method call is not implemented.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_method_response_get_result:
|
||||
* @response: an #FlMethodResponse.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or %NULL
|
||||
* to ignore.
|
||||
*
|
||||
* Gets the result of a method call, or an error if the response wasn't
|
||||
* successful.
|
||||
*
|
||||
* Returns: an #FlValue or %NULL on error.
|
||||
*/
|
||||
FlValue* fl_method_response_get_result(FlMethodResponse* response,
|
||||
GError** error);
|
||||
|
||||
/**
|
||||
* fl_method_success_response_new:
|
||||
* @result: (allow-none): the #FlValue returned by the method call or %NULL.
|
||||
*
|
||||
* Creates a response to a method call when that method has successfully
|
||||
* completed.
|
||||
*
|
||||
* Returns: a new #FlMethodResponse.
|
||||
*/
|
||||
FlMethodSuccessResponse* fl_method_success_response_new(FlValue* result);
|
||||
|
||||
/**
|
||||
* fl_method_success_response_get_result:
|
||||
* @response: an #FlMethodSuccessResponse.
|
||||
*
|
||||
* Gets the result of the method call.
|
||||
*
|
||||
* Returns: an #FlValue.
|
||||
*/
|
||||
FlValue* fl_method_success_response_get_result(
|
||||
FlMethodSuccessResponse* response);
|
||||
|
||||
/**
|
||||
* fl_method_error_response_new:
|
||||
* @result: an #FlValue.
|
||||
* @code: an error code.
|
||||
* @message: (allow-none): an error message.
|
||||
* @details: (allow-none): error details.
|
||||
*
|
||||
* Creates a response to a method call when that method has returned an error.
|
||||
*
|
||||
* Returns: a new #FlMethodErrorResponse.
|
||||
*/
|
||||
FlMethodErrorResponse* fl_method_error_response_new(const gchar* code,
|
||||
const gchar* message,
|
||||
FlValue* details);
|
||||
|
||||
/**
|
||||
* fl_method_error_response_get_code:
|
||||
* @response: an #FlMethodErrorResponse.
|
||||
*
|
||||
* Gets the error code reported.
|
||||
*
|
||||
* Returns: an error code.
|
||||
*/
|
||||
const gchar* fl_method_error_response_get_code(FlMethodErrorResponse* response);
|
||||
|
||||
/**
|
||||
* fl_method_error_response_get_message:
|
||||
* @response: an #FlMethodErrorResponse.
|
||||
*
|
||||
* Gets the error message reported.
|
||||
*
|
||||
* Returns: an error message or %NULL if no error message provided.
|
||||
*/
|
||||
const gchar* fl_method_error_response_get_message(
|
||||
FlMethodErrorResponse* response);
|
||||
|
||||
/**
|
||||
* fl_method_error_response_get_details:
|
||||
* @response: an #FlMethodErrorResponse.
|
||||
*
|
||||
* Gets the details provided with this error.
|
||||
*
|
||||
* Returns: an #FlValue or %NULL if no details provided.
|
||||
*/
|
||||
FlValue* fl_method_error_response_get_details(FlMethodErrorResponse* response);
|
||||
|
||||
/**
|
||||
* fl_method_not_implemented_response_new:
|
||||
*
|
||||
* Creates a response to a method call when that method does not exist.
|
||||
*
|
||||
* Returns: a new #FlMethodNotImplementedResponse.
|
||||
*/
|
||||
FlMethodNotImplementedResponse* fl_method_not_implemented_response_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_METHOD_RESPONSE_H_
|
||||
@@ -1,107 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_texture.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlPixelBufferTexture,
|
||||
fl_pixel_buffer_texture,
|
||||
FL,
|
||||
PIXEL_BUFFER_TEXTURE,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlPixelBufferTexture:
|
||||
*
|
||||
* #FlPixelBufferTexture represents an OpenGL texture generated from a pixel
|
||||
* buffer.
|
||||
*
|
||||
* The following example shows how to implement an #FlPixelBufferTexture.
|
||||
* ![<!-- language="C" -->
|
||||
* // Type definition, constructor, init, destructor and class_init are
|
||||
* // omitted.
|
||||
* struct _VideoPixelBufferTexture { // extends FlPixelBufferTexture
|
||||
* FlPixelBufferTexture parent_instance;
|
||||
*
|
||||
* uint8_t *buffer; // your pixel buffer.
|
||||
* }
|
||||
*
|
||||
* G_DEFINE_TYPE(VideoTexture,
|
||||
* video_texture,
|
||||
* fl_pixel_buffer_texture_get_type ())
|
||||
*
|
||||
* static gboolean
|
||||
* video_texture_copy_pixels (FlPixelBufferTexture* texture,
|
||||
* const uint8_t** out_buffer,
|
||||
* uint32_t* width,
|
||||
* uint32_t* height,
|
||||
* GError** error) {
|
||||
* // This method is called on Render Thread. Be careful with your
|
||||
* // cross-thread operation.
|
||||
*
|
||||
* // @width and @height are initially stored the canvas size in Flutter.
|
||||
*
|
||||
* // You must prepare your pixel buffer in RGBA format.
|
||||
* // So you may do some format conversion first if your original pixel
|
||||
* // buffer is not in RGBA format.
|
||||
* manage_your_pixel_buffer_here ();
|
||||
*
|
||||
* if (your_operations_are_successfully_finished) {
|
||||
* // Directly return pointer to your pixel buffer here.
|
||||
* // Flutter takes content of your pixel buffer after this function
|
||||
* // is finished. So you must make the buffer live long enough until
|
||||
* // next tick of Render Thread.
|
||||
* // If it is hard to manage lifetime of your pixel buffer, you should
|
||||
* // take look into #FlTextureGL.
|
||||
*
|
||||
* *out_buffer = buffer;
|
||||
* *width = real_width_of_buffer;
|
||||
* *height = real_height_of_buffer;
|
||||
* return TRUE;
|
||||
* } else {
|
||||
* // set @error to report failure.
|
||||
* return FALSE;
|
||||
* }
|
||||
* }
|
||||
* ]|
|
||||
*/
|
||||
|
||||
struct _FlPixelBufferTextureClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
/**
|
||||
* FlPixelBufferTexture::copy_pixels:
|
||||
* @texture: an #FlPixelBufferTexture.
|
||||
* @buffer: (out): pixel data.
|
||||
* @width: (inout): width of the texture in pixels.
|
||||
* @height: (inout): height of the texture in pixels.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL to ignore.
|
||||
*
|
||||
* Retrieve pixel buffer in RGBA format.
|
||||
*
|
||||
* As this method is usually invoked from the render thread, you must
|
||||
* take care of proper synchronization. It also needs to be ensured that
|
||||
* the returned buffer is not released prior to unregistering this texture.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean (*copy_pixels)(FlPixelBufferTexture* texture,
|
||||
const uint8_t** buffer,
|
||||
uint32_t* width,
|
||||
uint32_t* height,
|
||||
GError** error);
|
||||
};
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_
|
||||
@@ -1,76 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRAR_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRAR_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_binary_messenger.h"
|
||||
#include "fl_texture_registrar.h"
|
||||
#include "fl_view.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_INTERFACE(FlPluginRegistrar,
|
||||
fl_plugin_registrar,
|
||||
FL,
|
||||
PLUGIN_REGISTRAR,
|
||||
GObject)
|
||||
|
||||
struct _FlPluginRegistrarInterface {
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
FlBinaryMessenger* (*get_messenger)(FlPluginRegistrar* registrar);
|
||||
|
||||
FlTextureRegistrar* (*get_texture_registrar)(FlPluginRegistrar* registrar);
|
||||
|
||||
FlView* (*get_view)(FlPluginRegistrar* registrar);
|
||||
};
|
||||
|
||||
/**
|
||||
* FlPluginRegistrar:
|
||||
*
|
||||
* #FlPluginRegistrar is used when registering new plugins.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_plugin_registrar_get_messenger:
|
||||
* @registrar: an #FlPluginRegistrar.
|
||||
*
|
||||
* Gets the messenger this plugin can communicate with.
|
||||
*
|
||||
* Returns: an #FlBinaryMessenger.
|
||||
*/
|
||||
FlBinaryMessenger* fl_plugin_registrar_get_messenger(
|
||||
FlPluginRegistrar* registrar);
|
||||
|
||||
/**
|
||||
* fl_plugin_registrar_get_texture_registrar:
|
||||
* @registrar: an #FlPluginRegistrar.
|
||||
*
|
||||
* Gets the texture registrar this plugin can communicate with.
|
||||
*
|
||||
* Returns: an #FlTextureRegistrar.
|
||||
*/
|
||||
FlTextureRegistrar* fl_plugin_registrar_get_texture_registrar(
|
||||
FlPluginRegistrar* registrar);
|
||||
|
||||
/**
|
||||
* fl_plugin_registrar_get_view:
|
||||
* @registrar: an #FlPluginRegistrar.
|
||||
*
|
||||
* Get the view that Flutter is rendering with.
|
||||
*
|
||||
* Returns: (allow-none): an #FlView or %NULL if running in headless mode.
|
||||
*/
|
||||
FlView* fl_plugin_registrar_get_view(FlPluginRegistrar* registrar);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRAR_H_
|
||||
@@ -1,61 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "fl_plugin_registrar.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_INTERFACE(FlPluginRegistry,
|
||||
fl_plugin_registry,
|
||||
FL,
|
||||
PLUGIN_REGISTRY,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* FlPluginRegistry:
|
||||
*
|
||||
* #FlPluginRegistry vends #FlPluginRegistrar objects for named plugins.
|
||||
*/
|
||||
|
||||
struct _FlPluginRegistryInterface {
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/**
|
||||
* FlPluginRegistry::get_registrar_for_plugin:
|
||||
* @registry: an #FlPluginRegistry.
|
||||
* @name: plugin name.
|
||||
*
|
||||
* Gets the plugin registrar for the plugin with @name.
|
||||
*
|
||||
* Returns: (transfer full): an #FlPluginRegistrar.
|
||||
*/
|
||||
FlPluginRegistrar* (*get_registrar_for_plugin)(FlPluginRegistry* registry,
|
||||
const gchar* name);
|
||||
};
|
||||
|
||||
/**
|
||||
* fl_plugin_registry_get_registrar_for_plugin:
|
||||
* @registry: an #FlPluginRegistry.
|
||||
* @name: plugin name.
|
||||
*
|
||||
* Gets the plugin registrar for the plugin with @name.
|
||||
*
|
||||
* Returns: (transfer full): an #FlPluginRegistrar.
|
||||
*/
|
||||
FlPluginRegistrar* fl_plugin_registry_get_registrar_for_plugin(
|
||||
FlPluginRegistry* registry,
|
||||
const gchar* name);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_PLUGIN_REGISTRY_H_
|
||||
@@ -1,47 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_MESSAGE_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_MESSAGE_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_message_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlStandardMessageCodec,
|
||||
fl_standard_message_codec,
|
||||
FL,
|
||||
STANDARD_CODEC,
|
||||
FlMessageCodec)
|
||||
|
||||
/**
|
||||
* FlStandardMessageCodec:
|
||||
*
|
||||
* #FlStandardMessageCodec is an #FlMessageCodec that implements the Flutter
|
||||
* standard message encoding. This codec encodes and decodes #FlValue of type
|
||||
* #FL_VALUE_TYPE_NULL, #FL_VALUE_TYPE_BOOL, #FL_VALUE_TYPE_INT,
|
||||
* #FL_VALUE_TYPE_FLOAT, #FL_VALUE_TYPE_STRING, #FL_VALUE_TYPE_UINT8_LIST,
|
||||
* #FL_VALUE_TYPE_INT32_LIST, #FL_VALUE_TYPE_INT64_LIST,
|
||||
* #FL_VALUE_TYPE_FLOAT_LIST, #FL_VALUE_TYPE_LIST, and #FL_VALUE_TYPE_MAP.
|
||||
*
|
||||
* #FlStandardMessageCodec matches the StandardCodec class in the Flutter
|
||||
* services library.
|
||||
*/
|
||||
|
||||
/*
|
||||
* fl_standard_message_codec_new:
|
||||
*
|
||||
* Creates an #FlStandardMessageCodec.
|
||||
*
|
||||
* Returns: a new #FlStandardMessageCodec.
|
||||
*/
|
||||
FlStandardMessageCodec* fl_standard_message_codec_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_MESSAGE_CODEC_H_
|
||||
@@ -1,44 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_METHOD_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_METHOD_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_method_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlStandardMethodCodec,
|
||||
fl_standard_method_codec,
|
||||
FL,
|
||||
STANDARD_METHOD_CODEC,
|
||||
FlMethodCodec)
|
||||
|
||||
/**
|
||||
* FlStandardMethodCodec:
|
||||
*
|
||||
* #FlStandardMethodCodec is an #FlMethodCodec that implements method calls
|
||||
* using the Flutter standard message encoding. It should be used with a
|
||||
* #FlMethodChannel.
|
||||
*
|
||||
* #FlStandardMethodCodec matches the StandardMethodCodec class in the Flutter
|
||||
* services library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_standard_method_codec_new:
|
||||
*
|
||||
* Creates an #FlStandardMethodCodec.
|
||||
*
|
||||
* Returns: a new #FlStandardMethodCodec.
|
||||
*/
|
||||
FlStandardMethodCodec* fl_standard_method_codec_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_STANDARD_METHOD_CODEC_H_
|
||||
@@ -1,44 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_STRING_CODEC_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_STRING_CODEC_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include "fl_message_codec.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlStringCodec,
|
||||
fl_string_codec,
|
||||
FL,
|
||||
STRING_CODEC,
|
||||
FlMessageCodec)
|
||||
|
||||
/**
|
||||
* FlStringCodec:
|
||||
*
|
||||
* #FlStringCodec is an #FlMessageCodec that implements the Flutter string
|
||||
* message encoding. This only encodes and decodes #FlValue of type
|
||||
* #FL_VALUE_TYPE_STRING, other types #FlValues will generate an error during
|
||||
* encoding.
|
||||
*
|
||||
* #FlStringCodec matches the StringCodec class in the Flutter services library.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_string_codec_new:
|
||||
*
|
||||
* Creates an #FlStringCodec.
|
||||
*
|
||||
* Returns: a new #FlStringCodec.
|
||||
*/
|
||||
FlStringCodec* fl_string_codec_new();
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_STRING_CODEC_H_
|
||||
@@ -1,35 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <stdint.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_INTERFACE(FlTexture, fl_texture, FL, TEXTURE, GObject)
|
||||
|
||||
/**
|
||||
* FlTexture:
|
||||
*
|
||||
* #FlTexture represents a texture.
|
||||
*
|
||||
* You can derive #FlTextureGL for populating hardware-accelerated textures or
|
||||
* instantiate #FlPixelBufferTexture for populating pixel buffers. Do NOT
|
||||
* directly implement this interface.
|
||||
*/
|
||||
|
||||
struct _FlTextureInterface {
|
||||
GTypeInterface g_iface;
|
||||
};
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_H_
|
||||
@@ -1,103 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_GL_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_GL_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <stdint.h>
|
||||
#include "fl_texture.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_DERIVABLE_TYPE(FlTextureGL, fl_texture_gl, FL, TEXTURE_GL, GObject)
|
||||
|
||||
/**
|
||||
* FlTextureGL:
|
||||
*
|
||||
* #FlTextureGL is an abstract class that represents an OpenGL texture.
|
||||
*
|
||||
* If you want to render textures in other OpenGL context, create and use the
|
||||
* #GdkGLContext by calling gdk_window_create_gl_context () with the #GdkWindow
|
||||
* of #FlView. The context will be shared with the one used by Flutter.
|
||||
*
|
||||
* The following example shows how to implement an #FlTextureGL.
|
||||
* ![<!-- language="C" -->
|
||||
* #include <epoxy/gl.h>
|
||||
*
|
||||
* // Type definition, constructor, init, destructor, and class_init are
|
||||
* // omitted.
|
||||
* struct _VideoTextureGL { // extends FlTextureGL
|
||||
* FlTextureGL parent_instance;
|
||||
*
|
||||
* GLuint texture_id;
|
||||
* };
|
||||
*
|
||||
* G_DEFINE_TYPE(VideoTexture,
|
||||
* video_texture,
|
||||
* fl_texture_gl_get_type ())
|
||||
*
|
||||
* static gboolean
|
||||
* video_texture_populate (FlTextureGL *texture,
|
||||
* uint32_t *target,
|
||||
* uint32_t *name,
|
||||
* uint32_t *width,
|
||||
* uint32_t *height,
|
||||
* GError **error) {
|
||||
* VideoTextureGL *self = VIDEO_TEXTURE_GL (texture);
|
||||
* if (self->texture_id == 0) {
|
||||
* glGenTextures (1, &self->texture_id);
|
||||
* glBindTexture (GL_TEXTURE_2D, self->texture_id);
|
||||
* // further configuration here.
|
||||
* } else {
|
||||
* glBindTexture (GL_TEXTURE_2D, self->texture_id);
|
||||
* }
|
||||
*
|
||||
* // For example, we render pixel buffer here.
|
||||
* // Note that Flutter only accepts textures in GL_RGBA8 format.
|
||||
* static char buffer[] = { 0x1f, 0x2f, 0x3f, 0x4f }; // 1x1 pixel.
|
||||
* glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA,
|
||||
* GL_UNSIGNED_BYTE, buffer);
|
||||
*
|
||||
* *target = GL_TEXTURE_2D;
|
||||
* *name = self->texture_id;
|
||||
* *width = 1;
|
||||
* *height = 1;
|
||||
*
|
||||
* return TRUE;
|
||||
* }
|
||||
* ]|
|
||||
*/
|
||||
|
||||
struct _FlTextureGLClass {
|
||||
GObjectClass parent_class;
|
||||
|
||||
/**
|
||||
* Virtual method called when Flutter populates this texture. The OpenGL
|
||||
* context used by Flutter has been already set.
|
||||
* @texture: an #FlTexture.
|
||||
* @target: texture target (example GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE).
|
||||
* @name: (out): name of texture.
|
||||
* @width: (inout): width of the texture in pixels.
|
||||
* @height: (inout): height of the texture in pixels.
|
||||
* @error: (allow-none): #GError location to store the error occurring, or
|
||||
* %NULL to ignore.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean (*populate)(FlTextureGL* texture,
|
||||
uint32_t* target,
|
||||
uint32_t* name,
|
||||
uint32_t* width,
|
||||
uint32_t* height,
|
||||
GError** error);
|
||||
};
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_H_
|
||||
@@ -1,91 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_REGISTRAR_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_REGISTRAR_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "fl_texture.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_INTERFACE(FlTextureRegistrar,
|
||||
fl_texture_registrar,
|
||||
FL,
|
||||
TEXTURE_REGISTRAR,
|
||||
GObject)
|
||||
|
||||
struct _FlTextureRegistrarInterface {
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
gboolean (*register_texture)(FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
|
||||
FlTexture* (*lookup_texture)(FlTextureRegistrar* registrar, int64_t id);
|
||||
|
||||
gboolean (*mark_texture_frame_available)(FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
|
||||
gboolean (*unregister_texture)(FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
};
|
||||
|
||||
/**
|
||||
* FlTextureRegistrar:
|
||||
*
|
||||
* #FlTextureRegistrar is used when registering textures.
|
||||
*
|
||||
* Flutter Framework accesses your texture by the related unique texture ID. To
|
||||
* draw your texture in Dart, you should add Texture widget in your widget tree
|
||||
* with the same texture ID. Use platform channels to send this unique texture
|
||||
* ID to the Dart side.
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_texture_registrar_register_texture:
|
||||
* @registrar: an #FlTextureRegistrar.
|
||||
* @texture: an #FlTexture for registration.
|
||||
*
|
||||
* Registers a texture.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_texture_registrar_register_texture(FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
|
||||
/**
|
||||
* fl_texture_registrar_mark_texture_frame_available:
|
||||
* @registrar: an #FlTextureRegistrar.
|
||||
* @texture: the texture that has a frame available.
|
||||
*
|
||||
* Notifies the flutter engine that the texture object has updated and needs to
|
||||
* be rerendered.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_texture_registrar_mark_texture_frame_available(
|
||||
FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
|
||||
/**
|
||||
* fl_texture_registrar_unregister_texture:
|
||||
* @registrar: an #FlTextureRegistrar.
|
||||
* @texture: the texture being unregistered.
|
||||
*
|
||||
* Unregisters an existing texture object.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean fl_texture_registrar_unregister_texture(FlTextureRegistrar* registrar,
|
||||
FlTexture* texture);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_TEXTURE_REGISTRAR_H_
|
||||
@@ -1,614 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_VALUE_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_VALUE_H_
|
||||
|
||||
#include <glib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* FlValue:
|
||||
*
|
||||
* #FlValue is an object that contains the data types used in the platform
|
||||
* channel used by Flutter.
|
||||
*
|
||||
* In Dart the values are represented as follows:
|
||||
* - #FL_VALUE_TYPE_NULL: Null
|
||||
* - #FL_VALUE_TYPE_BOOL: bool
|
||||
* - #FL_VALUE_TYPE_INT: num
|
||||
* - #FL_VALUE_TYPE_FLOAT: num
|
||||
* - #FL_VALUE_TYPE_STRING: String
|
||||
* - #FL_VALUE_TYPE_UINT8_LIST: Uint8List
|
||||
* - #FL_VALUE_TYPE_INT32_LIST: Int32List
|
||||
* - #FL_VALUE_TYPE_INT64_LIST: Int64List
|
||||
* - #FL_VALUE_TYPE_FLOAT32_LIST: Float32List
|
||||
* - #FL_VALUE_TYPE_FLOAT_LIST: Float64List
|
||||
* - #FL_VALUE_TYPE_LIST: List<dynamic>
|
||||
* - #FL_VALUE_TYPE_MAP: Map<dynamic>
|
||||
*
|
||||
* See #FlMessageCodec to encode and decode these values.
|
||||
*/
|
||||
typedef struct _FlValue FlValue;
|
||||
|
||||
/**
|
||||
* FlValueType:
|
||||
* @FL_VALUE_TYPE_NULL: The null value.
|
||||
* @FL_VALUE_TYPE_BOOL: A boolean.
|
||||
* @FL_VALUE_TYPE_INT: A 64 bit signed integer.
|
||||
* @FL_VALUE_TYPE_FLOAT: A 64 bit floating point number.
|
||||
* @FL_VALUE_TYPE_STRING: UTF-8 text.
|
||||
* @FL_VALUE_TYPE_UINT8_LIST: An ordered list of unsigned 8 bit integers.
|
||||
* @FL_VALUE_TYPE_INT32_LIST: An ordered list of 32 bit integers.
|
||||
* @FL_VALUE_TYPE_INT64_LIST: An ordered list of 64 bit integers.
|
||||
* @FL_VALUE_TYPE_FLOAT_LIST: An ordered list of floating point numbers.
|
||||
* @FL_VALUE_TYPE_LIST: An ordered list of #FlValue objects.
|
||||
* @FL_VALUE_TYPE_MAP: A map of #FlValue objects keyed by #FlValue object.
|
||||
* @FL_VALUE_TYPE_FLOAT32_LIST: An ordered list of 32bit floating point numbers.
|
||||
*
|
||||
* Types of #FlValue.
|
||||
*/
|
||||
typedef enum {
|
||||
FL_VALUE_TYPE_NULL,
|
||||
FL_VALUE_TYPE_BOOL,
|
||||
FL_VALUE_TYPE_INT,
|
||||
FL_VALUE_TYPE_FLOAT,
|
||||
FL_VALUE_TYPE_STRING,
|
||||
FL_VALUE_TYPE_UINT8_LIST,
|
||||
FL_VALUE_TYPE_INT32_LIST,
|
||||
FL_VALUE_TYPE_INT64_LIST,
|
||||
FL_VALUE_TYPE_FLOAT_LIST,
|
||||
FL_VALUE_TYPE_LIST,
|
||||
FL_VALUE_TYPE_MAP,
|
||||
FL_VALUE_TYPE_FLOAT32_LIST,
|
||||
} FlValueType;
|
||||
|
||||
/**
|
||||
* fl_value_new_null:
|
||||
*
|
||||
* Creates an #FlValue that contains a null value. The equivalent Dart type is
|
||||
* null.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_null();
|
||||
|
||||
/**
|
||||
* fl_value_new_bool:
|
||||
* @value: the value.
|
||||
*
|
||||
* Creates an #FlValue that contains a boolean value. The equivalent Dart type
|
||||
* is a bool.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_bool(bool value);
|
||||
|
||||
/**
|
||||
* fl_value_new_int:
|
||||
* @value: the value.
|
||||
*
|
||||
* Creates an #FlValue that contains an integer number. The equivalent Dart type
|
||||
* is a num.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_int(int64_t value);
|
||||
|
||||
/**
|
||||
* fl_value_new_float:
|
||||
* @value: the value.
|
||||
*
|
||||
* Creates an #FlValue that contains a floating point number. The equivalent
|
||||
* Dart type is a num.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_float(double value);
|
||||
|
||||
/**
|
||||
* fl_value_new_string:
|
||||
* @value: a %NULL-terminated UTF-8 string.
|
||||
*
|
||||
* Creates an #FlValue that contains UTF-8 text. The equivalent Dart type is a
|
||||
* String.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_string(const gchar* value);
|
||||
|
||||
/**
|
||||
* fl_value_new_string_sized:
|
||||
* @value: a buffer containing UTF-8 text. It does not require a nul terminator.
|
||||
* @value_length: the number of bytes to use from @value.
|
||||
*
|
||||
* Creates an #FlValue that contains UTF-8 text. The equivalent Dart type is a
|
||||
* String.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_string_sized(const gchar* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_uint8_list:
|
||||
* @value: an array of unsigned 8 bit integers.
|
||||
* @value_length: number of elements in @value.
|
||||
*
|
||||
* Creates an ordered list containing 8 bit unsigned integers. The data is
|
||||
* copied. The equivalent Dart type is a Uint8List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_uint8_list(const uint8_t* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_uint8_list_from_bytes:
|
||||
* @value: a #GBytes.
|
||||
*
|
||||
* Creates an ordered list containing 8 bit unsigned integers. The data is
|
||||
* copied. The equivalent Dart type is a Uint8List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_uint8_list_from_bytes(GBytes* value);
|
||||
|
||||
/**
|
||||
* fl_value_new_int32_list:
|
||||
* @value: an array of signed 32 bit integers.
|
||||
* @value_length: number of elements in @value.
|
||||
*
|
||||
* Creates an ordered list containing 32 bit integers. The equivalent Dart type
|
||||
* is a Int32List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_int32_list(const int32_t* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_int64_list:
|
||||
* @value: an array of signed 64 bit integers.
|
||||
* @value_length: number of elements in @value.
|
||||
*
|
||||
* Creates an ordered list containing 64 bit integers. The equivalent Dart type
|
||||
* is a Int64List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_int64_list(const int64_t* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_float32_list:
|
||||
* @value: an array of floating point numbers.
|
||||
* @value_length: number of elements in @value.
|
||||
*
|
||||
* Creates an ordered list containing 32 bit floating point numbers.
|
||||
* The equivalent Dart type is a Float32List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_float32_list(const float* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_float_list:
|
||||
* @value: an array of floating point numbers.
|
||||
* @value_length: number of elements in @value.
|
||||
*
|
||||
* Creates an ordered list containing floating point numbers. The equivalent
|
||||
* Dart type is a Float64List.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_float_list(const double* value, size_t value_length);
|
||||
|
||||
/**
|
||||
* fl_value_new_list:
|
||||
*
|
||||
* Creates an ordered list. Children can be added to the list using
|
||||
* fl_value_append(). The children are accessed using fl_value_get_length()
|
||||
* and fl_value_get_list_value(). The equivalent Dart type is a List<dynamic>.
|
||||
*
|
||||
* The following example shows a simple list of values:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* g_autoptr(FlValue) value = fl_value_new_list ();
|
||||
* fl_value_append_take (value, fl_value_new_string ("one");
|
||||
* fl_value_append_take (value, fl_value_new_int (2);
|
||||
* fl_value_append_take (value, fl_value_new_double (3.0);
|
||||
* ]|
|
||||
*
|
||||
* This value can be decoded using:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* g_assert (fl_value_get_type (value) == FL_VALUE_TYPE_LIST);
|
||||
* for (size_t i = 0; i < fl_value_get_length (value); i++) {
|
||||
* FlValue *child = fl_value_get_list_value (value, i);
|
||||
* process_value (child);
|
||||
* }
|
||||
* ]|
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_list();
|
||||
|
||||
/**
|
||||
* fl_value_new_list_from_strv:
|
||||
* @value: a %NULL-terminated array of strings.
|
||||
*
|
||||
* Creates an ordered list containing #FlString values.
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_list_from_strv(const gchar* const* value);
|
||||
|
||||
/**
|
||||
* fl_value_new_map:
|
||||
*
|
||||
* Creates an ordered associative array. Children can be added to the map
|
||||
* using fl_value_set(), fl_value_set_take(), fl_value_set_string(),
|
||||
* fl_value_set_string_take(). The children are accessed using
|
||||
* fl_value_get_length(), fl_value_get_map_key(), fl_value_get_map_value(),
|
||||
* fl_value_lookup() and fl_value_lookup_string(). The equivalent Dart type is a
|
||||
* Map<dynamic>.
|
||||
*
|
||||
* The following example shows how to create a map of values keyed by strings:
|
||||
*
|
||||
* |[<!-- language="C" -->
|
||||
* g_autoptr(FlValue) value = fl_value_new_map ();
|
||||
* fl_value_set_string_take (value, "name", fl_value_new_string ("Gandalf"));
|
||||
* fl_value_set_string_take (value, "occupation",
|
||||
* fl_value_new_string ("Wizard"));
|
||||
* fl_value_set_string_take (value, "age", fl_value_new_int (2019));
|
||||
* ]|
|
||||
*
|
||||
* This value can be decoded using:
|
||||
* |[<!-- language="C" -->
|
||||
* g_assert (fl_value_get_type (value) == FL_VALUE_TYPE_MAP);
|
||||
* FlValue *name = fl_value_lookup_string (value, "name");
|
||||
* g_assert (fl_value_get_type (name) == FL_VALUE_TYPE_STRING);
|
||||
* FlValue *age = fl_value_lookup_string (value, "age");
|
||||
* g_assert (fl_value_get_type (age) == FL_VALUE_TYPE_INT);
|
||||
* g_message ("Next customer is %s (%d years old)",
|
||||
* fl_value_get_string (name),
|
||||
* fl_value_get_int (age));
|
||||
* ]|
|
||||
*
|
||||
* Returns: a new #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_new_map();
|
||||
|
||||
/**
|
||||
* fl_value_ref:
|
||||
* @value: an #FlValue.
|
||||
*
|
||||
* Increases the reference count of an #FlValue.
|
||||
*
|
||||
* Returns: the value that was referenced.
|
||||
*/
|
||||
FlValue* fl_value_ref(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_unref:
|
||||
* @value: an #FlValue.
|
||||
*
|
||||
* Decreases the reference count of an #FlValue. When the reference count hits
|
||||
* zero @value is destroyed and no longer valid.
|
||||
*/
|
||||
void fl_value_unref(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_type:
|
||||
* @value: an #FlValue.
|
||||
*
|
||||
* Gets the type of @value.
|
||||
*
|
||||
* Returns: an #FlValueType.
|
||||
*/
|
||||
FlValueType fl_value_get_type(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_equal:
|
||||
* @a: an #FlValue.
|
||||
* @b: an #FlValue.
|
||||
*
|
||||
* Compares two #FlValue to see if they are equivalent. Two values are
|
||||
* considered equivalent if they are of the same type and their data is the same
|
||||
* including any child values. For values of type #FL_VALUE_TYPE_MAP the order
|
||||
* of the values does not matter.
|
||||
*
|
||||
* Returns: %TRUE if both values are equivalent.
|
||||
*/
|
||||
bool fl_value_equal(FlValue* a, FlValue* b);
|
||||
|
||||
/**
|
||||
* fl_value_append:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_LIST.
|
||||
* @child: an #FlValue.
|
||||
*
|
||||
* Adds @child to the end of @value. Calling this with an #FlValue that is not
|
||||
* of type #FL_VALUE_TYPE_LIST is a programming error.
|
||||
*/
|
||||
void fl_value_append(FlValue* value, FlValue* child);
|
||||
|
||||
/**
|
||||
* fl_value_append_take:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_LIST.
|
||||
* @child: (transfer full): an #FlValue.
|
||||
*
|
||||
* Adds @child to the end of @value. Ownership of @child is taken by @value.
|
||||
* Calling this with an #FlValue that is not of type #FL_VALUE_TYPE_LIST is a
|
||||
* programming error.
|
||||
*/
|
||||
void fl_value_append_take(FlValue* value, FlValue* child);
|
||||
|
||||
/**
|
||||
* fl_value_set:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: an #FlValue.
|
||||
* @child_value: an #FlValue.
|
||||
*
|
||||
* Sets @key in @value to @child_value. If an existing value was in the map with
|
||||
* the same key it is replaced. Calling this with an #FlValue that is not of
|
||||
* type #FL_VALUE_TYPE_MAP is a programming error.
|
||||
*/
|
||||
void fl_value_set(FlValue* value, FlValue* key, FlValue* child_value);
|
||||
|
||||
/**
|
||||
* fl_value_set_take:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: (transfer full): an #FlValue.
|
||||
* @child_value: (transfer full): an #FlValue.
|
||||
*
|
||||
* Sets @key in @value to @child_value. Ownership of both @key and @child_value
|
||||
* is taken by @value. If an existing value was in the map with the same key it
|
||||
* is replaced. Calling this with an #FlValue that is not of type
|
||||
* #FL_VALUE_TYPE_MAP is a programming error.
|
||||
*/
|
||||
void fl_value_set_take(FlValue* value, FlValue* key, FlValue* child_value);
|
||||
|
||||
/**
|
||||
* fl_value_set_string:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: a UTF-8 text key.
|
||||
* @child_value: an #FlValue.
|
||||
*
|
||||
* Sets a value in the map with a text key. If an existing value was in the map
|
||||
* with the same key it is replaced. Calling this with an #FlValue that is not
|
||||
* of type #FL_VALUE_TYPE_MAP is a programming error.
|
||||
*/
|
||||
void fl_value_set_string(FlValue* value,
|
||||
const gchar* key,
|
||||
FlValue* child_value);
|
||||
|
||||
/**
|
||||
* fl_value_set_string_take:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: a UTF-8 text key.
|
||||
* @child_value: (transfer full): an #FlValue.
|
||||
*
|
||||
* Sets a value in the map with a text key, taking ownership of the value. If an
|
||||
* existing value was in the map with the same key it is replaced. Calling this
|
||||
* with an #FlValue that is not of type #FL_VALUE_TYPE_MAP is a programming
|
||||
* error.
|
||||
*/
|
||||
void fl_value_set_string_take(FlValue* value,
|
||||
const gchar* key,
|
||||
FlValue* child_value);
|
||||
|
||||
/**
|
||||
* fl_value_get_bool:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_BOOL.
|
||||
*
|
||||
* Gets the boolean value of @value. Calling this with an #FlValue that is
|
||||
* not of type #FL_VALUE_TYPE_BOOL is a programming error.
|
||||
*
|
||||
* Returns: a boolean value.
|
||||
*/
|
||||
bool fl_value_get_bool(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_int:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_INT.
|
||||
*
|
||||
* Gets the integer number of @value. Calling this with an #FlValue that is
|
||||
* not of type #FL_VALUE_TYPE_INT is a programming error.
|
||||
*
|
||||
* Returns: an integer number.
|
||||
*/
|
||||
int64_t fl_value_get_int(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_float:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_FLOAT.
|
||||
*
|
||||
* Gets the floating point number of @value. Calling this with an #FlValue
|
||||
* that is not of type #FL_VALUE_TYPE_FLOAT is a programming error.
|
||||
*
|
||||
* Returns: a floating point number.
|
||||
*/
|
||||
double fl_value_get_float(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_string:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_STRING.
|
||||
*
|
||||
* Gets the UTF-8 text contained in @value. Calling this with an #FlValue
|
||||
* that is not of type #FL_VALUE_TYPE_STRING is a programming error.
|
||||
*
|
||||
* Returns: a UTF-8 encoded string.
|
||||
*/
|
||||
const gchar* fl_value_get_string(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_length:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_UINT8_LIST,
|
||||
* #FL_VALUE_TYPE_INT32_LIST, #FL_VALUE_TYPE_INT64_LIST,
|
||||
* #FL_VALUE_TYPE_FLOAT32_LIST, #FL_VALUE_TYPE_FLOAT_LIST, #FL_VALUE_TYPE_LIST
|
||||
* or #FL_VALUE_TYPE_MAP.
|
||||
*
|
||||
* Gets the number of elements @value contains. This is only valid for list
|
||||
* and map types. Calling this with other types is a programming error.
|
||||
*
|
||||
* Returns: the number of elements inside @value.
|
||||
*/
|
||||
size_t fl_value_get_length(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_uint8_list:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_UINT8_LIST.
|
||||
*
|
||||
* Gets the array of unisigned 8 bit integers @value contains. The data
|
||||
* contains fl_value_get_length() elements. Calling this with an #FlValue that
|
||||
* is not of type #FL_VALUE_TYPE_UINT8_LIST is a programming error.
|
||||
*
|
||||
* Returns: an array of unsigned 8 bit integers.
|
||||
*/
|
||||
const uint8_t* fl_value_get_uint8_list(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_int32_list:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_INT32_LIST.
|
||||
*
|
||||
* Gets the array of 32 bit integers @value contains. The data contains
|
||||
* fl_value_get_length() elements. Calling this with an #FlValue that is not of
|
||||
* type #FL_VALUE_TYPE_INT32_LIST is a programming error.
|
||||
*
|
||||
* Returns: an array of 32 bit integers.
|
||||
*/
|
||||
const int32_t* fl_value_get_int32_list(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_int64_list:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_INT64_LIST.
|
||||
*
|
||||
* Gets the array of 64 bit integers @value contains. The data contains
|
||||
* fl_value_get_length() elements. Calling this with an #FlValue that is not of
|
||||
* type #FL_VALUE_TYPE_INT64_LIST is a programming error.
|
||||
*
|
||||
* Returns: an array of 64 bit integers.
|
||||
*/
|
||||
const int64_t* fl_value_get_int64_list(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_float32_list:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_FLOAT32_LIST.
|
||||
*
|
||||
* Gets the array of floating point numbers @value contains. The data
|
||||
* contains fl_value_get_length() elements. Calling this with an #FlValue that
|
||||
* is not of type #FL_VALUE_TYPE_FLOAT32_LIST is a programming error.
|
||||
*
|
||||
* Returns: an array of floating point numbers.
|
||||
*/
|
||||
const float* fl_value_get_float32_list(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_float_list:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_FLOAT_LIST.
|
||||
*
|
||||
* Gets the array of floating point numbers @value contains. The data
|
||||
* contains fl_value_get_length() elements. Calling this with an #FlValue that
|
||||
* is not of type #FL_VALUE_TYPE_FLOAT_LIST is a programming error.
|
||||
*
|
||||
* Returns: an array of floating point numbers.
|
||||
*/
|
||||
const double* fl_value_get_float_list(FlValue* value);
|
||||
|
||||
/**
|
||||
* fl_value_get_list_value:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_LIST.
|
||||
* @index: an index in the list.
|
||||
*
|
||||
* Gets a child element of the list. It is a programming error to request an
|
||||
* index that is outside the size of the list as returned from
|
||||
* fl_value_get_length(). Calling this with an #FlValue that is not of type
|
||||
* #FL_VALUE_TYPE_LIST is a programming error.
|
||||
*
|
||||
* Returns: an #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_get_list_value(FlValue* value, size_t index);
|
||||
|
||||
/**
|
||||
* fl_value_get_map_key:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @index: an index in the map.
|
||||
*
|
||||
* Gets a key from the map. It is a programming error to request an index that
|
||||
* is outside the size of the list as returned from fl_value_get_length().
|
||||
* Calling this with an #FlValue that is not of type #FL_VALUE_TYPE_MAP is a
|
||||
* programming error.
|
||||
*
|
||||
* Returns: an #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_get_map_key(FlValue* value, size_t index);
|
||||
|
||||
/**
|
||||
* fl_value_get_map_value:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @index: an index in the map.
|
||||
*
|
||||
* Gets a value from the map. It is a programming error to request an index that
|
||||
* is outside the size of the list as returned from fl_value_get_length().
|
||||
* Calling this with an #FlValue that is not of type #FL_VALUE_TYPE_MAP is a
|
||||
* programming error.
|
||||
*
|
||||
* Returns: an #FlValue.
|
||||
*/
|
||||
FlValue* fl_value_get_map_value(FlValue* value, size_t index);
|
||||
|
||||
/**
|
||||
* fl_value_lookup:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: a key value.
|
||||
*
|
||||
* Gets the map entry that matches @key. Keys are checked using
|
||||
* fl_value_equal(). Calling this with an #FlValue that is not of type
|
||||
* #FL_VALUE_TYPE_MAP is a programming error.
|
||||
*
|
||||
* Map lookups are not optimized for performance - if you have a large map or
|
||||
* need frequent access you should copy the data into another structure, e.g.
|
||||
* #GHashTable.
|
||||
*
|
||||
* Returns: (allow-none): the value with this key or %NULL if not one present.
|
||||
*/
|
||||
FlValue* fl_value_lookup(FlValue* value, FlValue* key);
|
||||
|
||||
/**
|
||||
* fl_value_lookup_string:
|
||||
* @value: an #FlValue of type #FL_VALUE_TYPE_MAP.
|
||||
* @key: a key value.
|
||||
*
|
||||
* Gets the map entry that matches @key. Keys are checked using
|
||||
* fl_value_equal(). Calling this with an #FlValue that is not of type
|
||||
* #FL_VALUE_TYPE_MAP is a programming error.
|
||||
*
|
||||
* Map lookups are not optimized for performance - if you have a large map or
|
||||
* need frequent access you should copy the data into another structure, e.g.
|
||||
* #GHashTable.
|
||||
*
|
||||
* Returns: (allow-none): the value with this key or %NULL if not one present.
|
||||
*/
|
||||
FlValue* fl_value_lookup_string(FlValue* value, const gchar* key);
|
||||
|
||||
/**
|
||||
* fl_value_to_string:
|
||||
* @value: an #FlValue.
|
||||
*
|
||||
* Converts an #FlValue to a text representation, suitable for logging purposes.
|
||||
* The text is formatted to be the equivalent of Dart toString() methods.
|
||||
*
|
||||
* Returns: UTF-8 text.
|
||||
*/
|
||||
gchar* fl_value_to_string(FlValue* value);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(FlValue, fl_value_unref)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_VALUE_H_
|
||||
@@ -1,61 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_VIEW_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_VIEW_H_
|
||||
|
||||
#if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION)
|
||||
#error "Only <flutter_linux/flutter_linux.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "fl_dart_project.h"
|
||||
#include "fl_engine.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_DECLARE_FINAL_TYPE(FlView, fl_view, FL, VIEW, GtkContainer)
|
||||
|
||||
/**
|
||||
* FlView:
|
||||
*
|
||||
* #FlView is a GTK widget that is capable of displaying a Flutter application.
|
||||
*
|
||||
* The following example shows how to set up a view in a GTK application:
|
||||
* |[<!-- language="C" -->
|
||||
* FlDartProject *project = fl_dart_project_new ();
|
||||
* FlView *view = fl_view_new (project);
|
||||
* gtk_widget_show (GTK_WIDGET (view));
|
||||
* gtk_container_add (GTK_CONTAINER (parent), view);
|
||||
*
|
||||
* FlBinaryMessenger *messenger =
|
||||
* fl_engine_get_binary_messenger (fl_view_get_engine (view));
|
||||
* setup_channels_or_plugins (messenger);
|
||||
* ]|
|
||||
*/
|
||||
|
||||
/**
|
||||
* fl_view_new:
|
||||
* @project: The project to show.
|
||||
*
|
||||
* Creates a widget to show Flutter application.
|
||||
*
|
||||
* Returns: a new #FlView.
|
||||
*/
|
||||
FlView* fl_view_new(FlDartProject* project);
|
||||
|
||||
/**
|
||||
* fl_view_get_engine:
|
||||
* @view: an #FlView.
|
||||
*
|
||||
* Gets the engine being rendered in the view.
|
||||
*
|
||||
* Returns: an #FlEngine.
|
||||
*/
|
||||
FlEngine* fl_view_get_engine(FlView* view);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_VIEW_H_
|
||||
@@ -1,37 +0,0 @@
|
||||
// Copyright 2013 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FLUTTER_LINUX_H_
|
||||
#define FLUTTER_SHELL_PLATFORM_LINUX_FLUTTER_LINUX_H_
|
||||
|
||||
#define __FLUTTER_LINUX_INSIDE__
|
||||
|
||||
#include <flutter_linux/fl_basic_message_channel.h>
|
||||
#include <flutter_linux/fl_binary_codec.h>
|
||||
#include <flutter_linux/fl_binary_messenger.h>
|
||||
#include <flutter_linux/fl_dart_project.h>
|
||||
#include <flutter_linux/fl_engine.h>
|
||||
#include <flutter_linux/fl_event_channel.h>
|
||||
#include <flutter_linux/fl_json_message_codec.h>
|
||||
#include <flutter_linux/fl_json_method_codec.h>
|
||||
#include <flutter_linux/fl_message_codec.h>
|
||||
#include <flutter_linux/fl_method_call.h>
|
||||
#include <flutter_linux/fl_method_channel.h>
|
||||
#include <flutter_linux/fl_method_codec.h>
|
||||
#include <flutter_linux/fl_method_response.h>
|
||||
#include <flutter_linux/fl_pixel_buffer_texture.h>
|
||||
#include <flutter_linux/fl_plugin_registrar.h>
|
||||
#include <flutter_linux/fl_plugin_registry.h>
|
||||
#include <flutter_linux/fl_standard_message_codec.h>
|
||||
#include <flutter_linux/fl_standard_method_codec.h>
|
||||
#include <flutter_linux/fl_string_codec.h>
|
||||
#include <flutter_linux/fl_texture.h>
|
||||
#include <flutter_linux/fl_texture_gl.h>
|
||||
#include <flutter_linux/fl_texture_registrar.h>
|
||||
#include <flutter_linux/fl_value.h>
|
||||
#include <flutter_linux/fl_view.h>
|
||||
|
||||
#undef __FLUTTER_LINUX_INSIDE__
|
||||
|
||||
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FLUTTER_LINUX_H_
|
||||
@@ -1,21 +0,0 @@
|
||||
# Generated code do not commit.
|
||||
file(TO_CMAKE_PATH "/home/krtirtho/fvm/versions/3.3.5" FLUTTER_ROOT)
|
||||
file(TO_CMAKE_PATH "/home/krtirtho/dev/fl-query/packages/fl_query/example" PROJECT_DIR)
|
||||
|
||||
set(FLUTTER_VERSION "1.0.0+1" PARENT_SCOPE)
|
||||
set(FLUTTER_VERSION_MAJOR 1 PARENT_SCOPE)
|
||||
set(FLUTTER_VERSION_MINOR 0 PARENT_SCOPE)
|
||||
set(FLUTTER_VERSION_PATCH 0 PARENT_SCOPE)
|
||||
set(FLUTTER_VERSION_BUILD 1 PARENT_SCOPE)
|
||||
|
||||
# Environment variables to pass to tool_backend.sh
|
||||
list(APPEND FLUTTER_TOOL_ENVIRONMENT
|
||||
"FLUTTER_ROOT=/home/krtirtho/fvm/versions/3.3.5"
|
||||
"PROJECT_DIR=/home/krtirtho/dev/fl-query/packages/fl_query/example"
|
||||
"DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ=="
|
||||
"DART_OBFUSCATION=false"
|
||||
"TRACK_WIDGET_CREATION=true"
|
||||
"TREE_SHAKE_ICONS=false"
|
||||
"PACKAGE_CONFIG=/home/krtirtho/dev/fl-query/packages/fl_query/example/.dart_tool/package_config.json"
|
||||
"FLUTTER_TARGET=/home/krtirtho/dev/fl-query/packages/fl_query/example/lib/main.dart"
|
||||
)
|
||||
@@ -5,8 +5,8 @@
|
||||
import FlutterMacOS
|
||||
import Foundation
|
||||
|
||||
import connectivity_plus_macos
|
||||
import path_provider_macos
|
||||
import connectivity_plus
|
||||
import path_provider_foundation
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
// This is a generated file; do not edit or check into version control.
|
||||
FLUTTER_ROOT=/home/krtirtho/fvm/versions/3.3.5
|
||||
FLUTTER_APPLICATION_PATH=/home/krtirtho/dev/fl-query/packages/fl_query/example
|
||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||
FLUTTER_BUILD_DIR=build
|
||||
FLUTTER_BUILD_NAME=1.0.0
|
||||
FLUTTER_BUILD_NUMBER=1
|
||||
DART_OBFUSCATION=false
|
||||
TRACK_WIDGET_CREATION=true
|
||||
TREE_SHAKE_ICONS=false
|
||||
PACKAGE_CONFIG=.dart_tool/package_config.json
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
export "FLUTTER_ROOT=/home/krtirtho/fvm/versions/3.3.5"
|
||||
export "FLUTTER_APPLICATION_PATH=/home/krtirtho/dev/fl-query/packages/fl_query/example"
|
||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||
export "FLUTTER_BUILD_DIR=build"
|
||||
export "FLUTTER_BUILD_NAME=1.0.0"
|
||||
export "FLUTTER_BUILD_NUMBER=1"
|
||||
export "DART_OBFUSCATION=false"
|
||||
export "TRACK_WIDGET_CREATION=true"
|
||||
export "TREE_SHAKE_ICONS=false"
|
||||
export "PACKAGE_CONFIG=.dart_tool/package_config.json"
|
||||
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 51;
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXAggregateTarget section */
|
||||
@@ -235,6 +235,7 @@
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3399D490228B24CF009A79C7 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
@@ -344,7 +345,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
@@ -423,7 +424,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
@@ -470,7 +471,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
|
||||
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 520 B |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.0 KiB |