├── .fvmrc
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ ├── documentation_update.md
│ └── feature_request.md
├── PULL_REQUEST_TEMPLATE.md
├── PULL_REQUEST_TEMPLATE
│ ├── bug_fix.md
│ ├── documentation_update.md
│ └── new_feature.md
└── workflows
│ ├── on_close_issue_add_comment_to_pyrus_task.yml
│ ├── on_close_pr_add_comment_to_pyrus_task.yml
│ ├── on_open_issue_create_pyrus_task.yml
│ ├── on_open_pr_create_pyrus_task.yml
│ ├── on_pull_request.yml
│ └── publish_to_pub.yml
├── .gitignore
├── .markdownlint.json
├── .metadata
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── dart_dependency_validator.yaml
├── example
├── .gitignore
├── .metadata
├── analysis_options.yaml
├── android
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── example
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── drawable-v21
│ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable
│ │ │ │ └── launch_background.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── values-night
│ │ │ │ └── styles.xml
│ │ │ │ └── values
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── ios
│ ├── Flutter
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── Runner
│ │ ├── AppDelegate.h
│ │ ├── AppDelegate.m
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── main.m
├── lib
│ ├── main.dart
│ └── screens
│ │ ├── main_page.dart
│ │ └── my_app.dart
├── pubspec.lock
├── pubspec.yaml
└── web
│ ├── favicon.png
│ ├── icons
│ ├── Icon-192.png
│ ├── Icon-512.png
│ ├── Icon-maskable-192.png
│ └── Icon-maskable-512.png
│ ├── index.html
│ └── manifest.json
├── lib
├── src
│ ├── cupertino_swipe_refresh.dart
│ ├── material_swipe_refresh.dart
│ ├── swipe_refresh.dart
│ ├── swipe_refresh_base.dart
│ ├── swipe_refresh_state.dart
│ ├── swipe_refresh_style.dart
│ └── widgets
│ │ ├── conditional_wrapper.dart
│ │ └── scroll_behavior_in_web.dart
├── swipe_refresh.dart
└── utills
│ └── platform_wrapper.dart
├── pubspec.lock
├── pubspec.yaml
└── test
├── platform_wrapper_test.dart
├── swipe_refresh_adaptive_test.dart
├── swipe_refresh_builder_test.dart
├── swipe_refresh_cupertino_test.dart
├── swipe_refresh_material_test.dart
└── test_utils.dart
/.fvmrc:
--------------------------------------------------------------------------------
1 | {
2 | "flutter": "3.19.0"
3 | }
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Something is wrong.
4 | title: "[BUG] "
5 | labels: bug
6 | ---
7 |
11 | ## Expected behavior
12 |
13 |
14 | ## Actual behavior
15 |
16 |
17 | ## Video/Screenshot
18 |
19 |
20 | ## Steps to reproduce
21 |
27 |
28 | ## Details
29 |
30 | Flutter version:
31 |
32 | Dart version:
33 |
34 | Platform:
35 |
36 | ## Logs and stacktrace
37 |
40 |
41 | ## Any possible solutions
42 |
46 |
47 | ## What did you try to solve
48 |
52 |
53 | ## Checklist for self-check
54 |
55 | - [ ] Added expected and actual behavior.
56 | - [ ] Added video or screenshot of bug.
57 | - [ ] Added isolated way to reproduce the bug.
58 | - [ ] Specified Flutter, Dart version and platforms.
59 | - [ ] Attached error code and logs.
60 | - [ ] All unspecified fields in the Issue description are deleted.
61 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: SurfGear telegram chat
4 | url: https://t.me/SurfGear
5 | about: Please ask and answer questions here.
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/documentation_update.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Documentation update
3 | about: Fixing a problem or improve in an existing docs page.
4 | labels: documentation
5 | ---
6 |
10 | ## Describe what scenario you think is uncovered by the existing examples / articles
11 |
12 |
13 | ## Describe why existing examples / articles do not cover this case
14 |
15 |
16 | ## Additional context
17 |
18 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: I'd like SurfGear team to do something new.
4 | labels: enhancement
5 | ---
6 |
12 | ## What is the new or updated feature that you are suggesting?
13 |
14 |
15 | ## Why should this feature be included?
16 |
17 |
18 | ## Additional context
19 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Tap on "Preview" ⤴
2 |
3 | And choose one of the templates:
4 |
5 | * [Bugfix PR](?expand=1&template=bug_fix.md)
6 | * [New feature PR](?expand=1&template=new_feature.md)
7 | * [Documentation update PR](?expand=1&template=documentation_update.md)
8 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE/bug_fix.md:
--------------------------------------------------------------------------------
1 |
6 | ## Checklist
7 |
8 | - [ ] Have you added an explanation of what your changes do and why you'd like us to include them?
9 | - [ ] Is there an existing issue for this PR?
10 | - _link issue here_ (use keywords like `fix`, `close`, `resolve` etc. if necessary)
11 | - [ ] Have the files been linted and formatted?
12 | - [ ] Have the docs been updated to match the changes in the PR?
13 | - [ ] Have the tests been updated to match the changes in the PR?
14 | - [ ] Attached videos/screenshots demonstrating the fix/feature.
15 | - [ ] Have you run the tests locally to confirm they pass?
16 |
17 | ## Changes
18 |
19 | ### What is the current behavior, and the steps to reproduce the issue?
20 |
21 | ### What is the expected behavior?
22 |
23 | ### How does this PR fix the problem?
24 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE/documentation_update.md:
--------------------------------------------------------------------------------
1 |
6 | ## Checklist
7 |
8 | - [ ] Is there an existing issue for this PR?
9 | - _link issue here_ (use keywords like `fix`, `close`, `resolve` etc. if necessary)
10 | - [ ] Have the files been linted and formatted?
11 |
12 | ## Changes
13 |
14 | ### What docs page needs to be fixed?
15 |
16 | - **Section**:
17 | - **Page**:
18 |
19 | ## What is the problem?
20 |
21 | ## What changes does this PR make to fix the problem?
22 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE/new_feature.md:
--------------------------------------------------------------------------------
1 |
6 | ## Checklist
7 |
8 | - [ ] Have you added an explanation of what your changes do and why you'd like us to include them?
9 | - [ ] Is there an existing issue for this PR?
10 | - _link issue here_ (use keywords like `fix`, `close`, `resolve` etc. if necessary)
11 | - [ ] Have the files been linted and formatted?
12 | - [ ] Have the docs been updated to match the changes in the PR?
13 | - [ ] Have the tests been updated to match the changes in the PR?
14 | - [ ] Attached videos/screenshots demonstrating the fix/feature.
15 | - [ ] Have you run the tests locally to confirm they pass?
16 |
17 | ## New Features
18 |
19 | ### What new capabilities does this PR add?
20 |
21 | ### What docs changes are needed to explain this?
22 |
--------------------------------------------------------------------------------
/.github/workflows/on_close_issue_add_comment_to_pyrus_task.yml:
--------------------------------------------------------------------------------
1 | name: Add comment to Pyrus task on issue close
2 |
3 | on:
4 | issues:
5 | types:
6 | - closed
7 |
8 | jobs:
9 | get_pyrus_task_id:
10 | name: Get Pyrus task ID from special comment in issue
11 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_pyrus_task_id_from_issue_or_pr_comment.yml@main
12 | with:
13 | ISSUE_NUMBER: ${{ github.event.issue.number }}
14 |
15 | add_comment_to_pyrus_task:
16 | name: Add comment to Pyrus task
17 | needs: get_pyrus_task_id
18 | uses: surfstudio/flutter-ci-workflows/.github/workflows/add_comment_to_pyrus_task.yml@main
19 | with:
20 | PYRUS_TASK_ID: ${{ needs.get_pyrus_task_id.outputs.PYRUS_TASK_ID }}
21 | COMMENT_TEXT: The issue is closed.
22 | secrets:
23 | LOGIN: ${{ secrets.PYRUS_BOT_LOGIN }}
24 | SECURITY_KEY: ${{ secrets.PYRUS_BOT_SECRET_KEY }}
25 |
--------------------------------------------------------------------------------
/.github/workflows/on_close_pr_add_comment_to_pyrus_task.yml:
--------------------------------------------------------------------------------
1 | name: Add comment to Pyrus task on PR close
2 |
3 | on:
4 | pull_request:
5 | types:
6 | - closed
7 |
8 | jobs:
9 | get_pyrus_task_id:
10 | name: Get Pyrus task ID from special comment in issue
11 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_pyrus_task_id_from_issue_or_pr_comment.yml@main
12 | with:
13 | ISSUE_NUMBER: ${{ github.event.pull_request.number }}
14 |
15 | add_comment_to_pyrus_task:
16 | name: Add comment to Pyrus task
17 | needs: get_pyrus_task_id
18 | uses: surfstudio/flutter-ci-workflows/.github/workflows/add_comment_to_pyrus_task.yml@main
19 | with:
20 | PYRUS_TASK_ID: ${{ needs.get_pyrus_task_id.outputs.PYRUS_TASK_ID }}
21 | COMMENT_TEXT: The pull request is closed.
22 | secrets:
23 | LOGIN: ${{ secrets.PYRUS_BOT_LOGIN }}
24 | SECURITY_KEY: ${{ secrets.PYRUS_BOT_SECRET_KEY }}
25 |
--------------------------------------------------------------------------------
/.github/workflows/on_open_issue_create_pyrus_task.yml:
--------------------------------------------------------------------------------
1 | name: Create Pyrus task from new issue
2 |
3 | on:
4 | issues:
5 | types:
6 | - opened
7 | - reopened
8 |
9 | jobs:
10 | get_package_name:
11 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_package_name.yml@main
12 |
13 | create_pyrus_task:
14 | name: Create Pyrus task from issue
15 | needs: get_package_name
16 | uses: surfstudio/flutter-ci-workflows/.github/workflows/create_pyrus_task_from_issue_or_pr.yml@main
17 | with:
18 | TYPE: Issue
19 | PACKAGE_NAME: ${{ needs.get_package_name.outputs.package_name }}
20 | TITLE: ${{ github.event.issue.title }}
21 | LINK: ${{ github.event.issue.html_url }}
22 | secrets:
23 | LOGIN: ${{ secrets.PYRUS_BOT_LOGIN }}
24 | SECURITY_KEY: ${{ secrets.PYRUS_BOT_SECRET_KEY }}
25 |
26 | add_pyrus_task_link:
27 | name: Add Pyrus task link
28 | needs: create_pyrus_task
29 | uses: surfstudio/flutter-ci-workflows/.github/workflows/add_comment_to_issue_or_pr.yml@main
30 | with:
31 | ISSUE_NUMBER: ${{ github.event.issue.number }}
32 | # Don't change the comment link, because the Pyrus task ID is searched by the link text
33 | COMMENT_TEXT: "[Link to Pyrus task](https://pyrus.com/t#id${{ needs.create_pyrus_task.outputs.PYRUS_TASK_ID }})"
34 | REACTIONS: rocket
35 |
--------------------------------------------------------------------------------
/.github/workflows/on_open_pr_create_pyrus_task.yml:
--------------------------------------------------------------------------------
1 | name: Create Pyrus task from new PR
2 |
3 | on:
4 | pull_request:
5 | types:
6 | - opened
7 | - reopened
8 |
9 | jobs:
10 | get_package_name:
11 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_package_name.yml@main
12 |
13 | create_pyrus_task:
14 | name: Create Pyrus task from pull request
15 | needs: get_package_name
16 | uses: surfstudio/flutter-ci-workflows/.github/workflows/create_pyrus_task_from_issue_or_pr.yml@main
17 | with:
18 | TYPE: Pull request
19 | PACKAGE_NAME: ${{ needs.get_package_name.outputs.package_name }}
20 | TITLE: ${{ github.event.pull_request.title }}
21 | LINK: ${{ github.event.pull_request.html_url }}
22 | secrets:
23 | LOGIN: ${{ secrets.PYRUS_BOT_LOGIN }}
24 | SECURITY_KEY: ${{ secrets.PYRUS_BOT_SECRET_KEY }}
25 |
26 | add_pyrus_task_link:
27 | name: Add Pyrus task link
28 | needs: create_pyrus_task
29 | uses: surfstudio/flutter-ci-workflows/.github/workflows/add_comment_to_issue_or_pr.yml@main
30 | with:
31 | ISSUE_NUMBER: ${{ github.event.pull_request.number }}
32 | # Don't change the comment link, because the Pyrus task ID is searched by the link text
33 | COMMENT_TEXT: "[Link to Pyrus task](https://pyrus.com/t#id${{ needs.create_pyrus_task.outputs.PYRUS_TASK_ID }})"
34 | REACTIONS: rocket
35 |
--------------------------------------------------------------------------------
/.github/workflows/on_pull_request.yml:
--------------------------------------------------------------------------------
1 | name: On pull request
2 |
3 | on:
4 | pull_request:
5 |
6 | jobs:
7 | get_flutter_version:
8 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_flutter_version.yml@main
9 |
10 | analysis:
11 | needs: get_flutter_version
12 | uses: surfstudio/flutter-ci-workflows/.github/workflows/analysis.yml@main
13 | with:
14 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
15 |
16 | testing:
17 | needs: [analysis, get_flutter_version]
18 | uses: surfstudio/flutter-ci-workflows/.github/workflows/testing.yml@main
19 | with:
20 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
21 | secrets:
22 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
23 |
24 | build_android_example:
25 | needs: [analysis, get_flutter_version]
26 | uses: surfstudio/flutter-ci-workflows/.github/workflows/build_android_example.yml@main
27 | with:
28 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
29 |
30 | build_ios_example:
31 | needs: [analysis, get_flutter_version]
32 | uses: surfstudio/flutter-ci-workflows/.github/workflows/build_ios_example.yml@main
33 | with:
34 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
35 |
--------------------------------------------------------------------------------
/.github/workflows/publish_to_pub.yml:
--------------------------------------------------------------------------------
1 | name: Publishing
2 |
3 | on:
4 | push:
5 | tags:
6 | - v*
7 |
8 | jobs:
9 | get_flutter_version:
10 | uses: surfstudio/flutter-ci-workflows/.github/workflows/get_flutter_version.yml@main
11 |
12 | analysis:
13 | needs: get_flutter_version
14 | uses: surfstudio/flutter-ci-workflows/.github/workflows/analysis.yml@main
15 | with:
16 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
17 |
18 | testing:
19 | needs: [analysis, get_flutter_version]
20 | uses: surfstudio/flutter-ci-workflows/.github/workflows/testing.yml@main
21 | with:
22 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
23 | secrets:
24 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
25 |
26 | package-publishing:
27 | needs: [analysis, testing, get_flutter_version]
28 | uses: surfstudio/flutter-ci-workflows/.github/workflows/publish_to_pub.yml@main
29 | with:
30 | FLUTTER_VERSION: ${{ needs.get_flutter_version.outputs.FLUTTER_VERSION }}
31 | PANA_TOTAL: "100"
32 | secrets:
33 | PUB_CREDENTIAL_JSON: ${{ secrets.SURF_PUB_CREDENTIAL_JSON }}
34 | PUB_OAUTH_ACCESS_TOKEN: ${{ secrets.SURF_PUB_OAUTH_ACCESS_TOKEN }}
35 | PUB_OAUTH_REFRESH_TOKEN: ${{ secrets.SURF_PUB_OAUTH_REFRESH_TOKEN }}
36 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.lock
4 | *.log
5 | *.pyc
6 | *.swp
7 | .DS_Store
8 | .atom/
9 | .buildlog/
10 | .history
11 | .svn/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # Visual Studio Code related
20 | .classpath
21 | .project
22 | .settings/
23 | .vscode/
24 |
25 | # Flutter/Dart/Pub related
26 | **/doc/api/
27 | .dart_tool/
28 | .flutter-plugins
29 | .flutter-plugins-dependencies
30 | .packages
31 | .pub-cache/
32 | .pub/
33 | build/
34 |
35 | # FVM
36 | .fvm/
37 |
38 | # Android related
39 | **/android/**/gradle-wrapper.jar
40 | **/android/.gradle
41 | **/android/captures/
42 | **/android/gradlew
43 | **/android/gradlew.bat
44 | **/android/local.properties
45 | **/android/**/GeneratedPluginRegistrant.java
46 |
47 | # iOS/XCode related
48 | **/ios/**/*.mode1v3
49 | **/ios/**/*.mode2v3
50 | **/ios/**/*.moved-aside
51 | **/ios/**/*.pbxuser
52 | **/ios/**/*.perspectivev3
53 | **/ios/**/*sync/
54 | **/ios/**/.sconsign.dblite
55 | **/ios/**/.tags*
56 | **/ios/**/.vagrant/
57 | **/ios/**/DerivedData/
58 | **/ios/**/Icon?
59 | **/ios/**/Pods/
60 | **/ios/**/.symlinks/
61 | **/ios/**/profile
62 | **/ios/**/xcuserdata
63 | **/ios/.generated/
64 | **/ios/Flutter/App.framework
65 | **/ios/Flutter/Flutter.framework
66 | **/ios/Flutter/Generated.xcconfig
67 | **/ios/Flutter/flutter_export_environment.sh
68 | **/ios/Flutter/app.flx
69 | **/ios/Flutter/app.zip
70 | **/ios/Flutter/flutter_assets/
71 | **/ios/ServiceDefinitions.json
72 | **/ios/Runner/GeneratedPluginRegistrant.*
73 |
74 | # Coverage
75 | coverage/
76 |
77 | # Exceptions to above rules.
78 | !**/ios/**/default.mode1v3
79 | !**/ios/**/default.mode2v3
80 | !**/ios/**/default.pbxuser
81 | !**/ios/**/default.perspectivev3
82 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "MD041": false,
3 | "MD033": false,
4 | "MD013": false
5 | }
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 20e59316b8b8474554b38493b8ca888794b0234a
8 | channel: unknown
9 |
10 | project_type: package
11 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## 1.1.2
4 |
5 | * Correct logo position.
6 |
7 | ## 1.1.1
8 |
9 | * Rebranding.
10 |
11 | ## 1.1.0
12 |
13 | * Added support for all TargetPlatform.
14 | * Added cacheExtent property.
15 | * SDK version is up.
16 |
17 | ## 1.0.2
18 |
19 | * Internal improvements.
20 |
21 | ## 1.0.1
22 |
23 | * Stable release
24 |
25 | ## 1.0.1-dev.1
26 |
27 | * Apply new lint rules.
28 |
29 | ## 1.0.0
30 |
31 | * Migrate this package to null safety.
32 |
33 | ## 0.0.1-dev.9
34 |
35 | * Added keyboardDismissBehavior (Material) and scroll physics
36 |
37 | ## 0.0.1-dev.7
38 |
39 | * Added shrinkWrap to Refreshers
40 |
41 | ## 0.0.1-dev.6
42 |
43 | * Added Scroll controller to Refreshers
44 |
45 | ## 0.0.1-dev.5
46 |
47 | * Fix lint hints
48 |
49 | ## 0.0.1-dev.0
50 |
51 | * Initial release
52 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing rules
2 |
3 | Thank you for your help! Before you start, let's take a look at some agreements.
4 |
5 | ## Pull request rules
6 |
7 | Make sure that your code:
8 |
9 | 1. Does not contain analyzer errors.
10 | 2. Follows a [official style](https://dart.dev/guides/language/effective-dart/style).
11 | 3. Follows the official [style of formatting](https://flutter.dev/docs/development/tools/formatting).
12 | 4. Contains no errors.
13 | 5. New functionality is covered by tests. New functionality passes old tests.
14 | 6. Create example that demonstrate new functionality if it is possible.
15 |
16 | ## Accepting the changes
17 |
18 | After your pull request passes the review code, the project maintainers will merge the changes
19 | into the branch to which the pull request was sent.
20 |
21 | ## Issues
22 |
23 | Feel free to report any issues and bugs.
24 |
25 | 1. To report about the problem, create an issue on GitHub.
26 | 2. In the issue add the description of the problem.
27 | 3. Do not forget to mention your development environment, Flutter version, libraries required for
28 | illustration of the problem.
29 | 4. It is necessary to attach the code part that causes an issue or to make a small demo project
30 | that shows the issue.
31 | 5. Attach stack trace so it helps us to deal with the issue.
32 | 6. If the issue is related to graphics, screen recording is required.
33 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "{}"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright 2019 SurfStudio LLC
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Swipe Refresh
2 |
3 |
4 |
5 |
6 | [](https://github.com/surfstudio/flutter-swipe-refresh)
7 | [](https://app.codecov.io/gh/surfstudio/flutter-swipe-refresh)
8 | [](https://pub.dev/packages/swipe_refresh)
9 | [](https://pub.dev/packages/swipe_refresh)
10 | [](https://pub.dev/packages/swipe_refresh/score)
11 | 
12 |
13 | ## Overview
14 |
15 | Widget for refresh by swipe.
16 |
17 | - :1234: Enabled on every platform - the package is fully written on Flutter side and enabled on every platform.
18 | - :recycle: Fully covered by tests - guaranteeing the result and expectations from this package.
19 | - :notebook_with_decorative_cover: End-to-end documentation - every aspect of implementation is documented, so there is full understanding.
20 | - :cow2: Support from the best Flutter experts - we are open to any enhancement ideas and contributions.
21 |
22 | 
23 | 
24 |
25 | Main classes:
26 |
27 | 1. [Refresh state](lib/src/swipe_refresh_state.dart)
28 | 2. [Widget for indicate swipe refresh](lib/src/swipe_refresh.dart)
29 | 3. [Widget for indicate swipe refresh Material style](lib/src/material_swipe_refresh.dart)
30 | 4. [Widget for indicate swipe refresh Cupertino style](lib/src/cupertino_swipe_refresh.dart)
31 |
32 | ## Example
33 |
34 | ### Material
35 |
36 | Refresh indicator widget with Material Design style.
37 |
38 | ```dart
39 | SwipeRefresh.material(
40 | stateStream: Stream(),
41 | onRefresh: _refresh,
42 | padding: const EdgeInsets.symmetric(vertical: 10),
43 | children: [ ... ],
44 | );
45 |
46 | Future _refresh() async {
47 | // When all needed is done change state.
48 | _controller.sink.add(SwipeRefreshState.hidden);
49 | }
50 | ```
51 |
52 | ### Cupertino
53 |
54 | Refresh indicator widget with Cupertino Design style.
55 |
56 | ```dart
57 | SwipeRefresh.cupertino(
58 | stateStream: Stream(),
59 | onRefresh: _refresh,
60 | padding: const EdgeInsets.symmetric(vertical: 10),
61 | children: [ ... ],
62 | );
63 |
64 | Future _refresh() async {
65 | // When all needed is done change state.
66 | _controller.sink.add(SwipeRefreshState.hidden);
67 | }
68 | ```
69 |
70 | ### Adaptive
71 |
72 | Refresh indicator widget with adaptive to platform style.
73 |
74 | ```dart
75 | SwipeRefresh.adaptive(
76 | stateStream: Stream(),
77 | onRefresh: _refresh,
78 | padding: const EdgeInsets.symmetric(vertical: 10),
79 | children: [ ... ],
80 | );
81 |
82 | Future _refresh() async {
83 | // When all needed is done change state.
84 | _controller.sink.add(SwipeRefreshState.hidden);
85 | }
86 | ```
87 |
88 | ### Builder
89 |
90 | Refresh indicator widget with adaptive to platform style, and with SliverChildBuilderDelegate in childDelegate(so as not to create more child elements than are visible through Viewport).
91 |
92 | ```dart
93 | SwipeRefresh.builder(
94 | stateStream: Stream(),
95 | onRefresh: _refresh,
96 | padding: const EdgeInsets.symmetric(vertical: 10),
97 | itemCount: Colors.primaries.length,
98 | itemBuilder: (context, index) {
99 | return Container(
100 | ...
101 | );
102 | },
103 | ),
104 |
105 | Future _refresh() async {
106 | // When all needed is done change state.
107 | _controller.sink.add(SwipeRefreshState.hidden);
108 | }
109 | ```
110 |
111 | ## Installation
112 |
113 | Add `swipe_refresh` to your `pubspec.yaml` file:
114 |
115 | ```yaml
116 | dependencies:
117 | swipe_refresh: $currentVersion$
118 | ```
119 |
120 |
At this moment, the current version of swipe_refresh is .