Commit f04b1b9e authored by 汪林玲's avatar 汪林玲

Initial commit

parents
.DS_Store
.dart_tool/
.packages
.pub/
build/
ios/.generated/
ios/Flutter/Generated.xcconfig
ios/Runner/GeneratedPluginRegistrant.*
*.log
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" fileNamingConvention="NONE" />
<pair source="c" header="h" fileNamingConvention="NONE" />
</extensions>
</Objective-C-extensions>
</code_scheme>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Dart Packages" type="DartPackagesLibraryType">
<properties>
<option name="packageNameToDirsMap">
<entry key="async">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/async-2.0.8/lib" />
</list>
</value>
</entry>
<entry key="boolean_selector">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/boolean_selector-1.0.4/lib" />
</list>
</value>
</entry>
<entry key="charcode">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/charcode-1.1.2/lib" />
</list>
</value>
</entry>
<entry key="collection">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/collection-1.14.11/lib" />
</list>
</value>
</entry>
<entry key="convert">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/convert-2.1.1/lib" />
</list>
</value>
</entry>
<entry key="crypto">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/crypto-2.0.6/lib" />
</list>
</value>
</entry>
<entry key="cupertino_icons">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/cupertino_icons-0.1.2/lib" />
</list>
</value>
</entry>
<entry key="file">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/file-5.0.7/lib" />
</list>
</value>
</entry>
<entry key="flutter">
<value>
<list>
<option value="$USER_HOME$/working/flutter/packages/flutter/lib" />
</list>
</value>
</entry>
<entry key="flutter_driver">
<value>
<list>
<option value="$USER_HOME$/working/flutter/packages/flutter_driver/lib" />
</list>
</value>
</entry>
<entry key="flutter_test">
<value>
<list>
<option value="$USER_HOME$/working/flutter/packages/flutter_test/lib" />
</list>
</value>
</entry>
<entry key="fuchsia_remote_debug_protocol">
<value>
<list>
<option value="$USER_HOME$/working/flutter/packages/fuchsia_remote_debug_protocol/lib" />
</list>
</value>
</entry>
<entry key="intl">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/intl-0.15.7/lib" />
</list>
</value>
</entry>
<entry key="json_rpc_2">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/json_rpc_2-2.0.9/lib" />
</list>
</value>
</entry>
<entry key="matcher">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/matcher-0.12.3+1/lib" />
</list>
</value>
</entry>
<entry key="meta">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/meta-1.1.6/lib" />
</list>
</value>
</entry>
<entry key="path">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/path-1.6.2/lib" />
</list>
</value>
</entry>
<entry key="pedantic">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/pedantic-1.4.0/lib" />
</list>
</value>
</entry>
<entry key="platform">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/platform-2.2.0/lib" />
</list>
</value>
</entry>
<entry key="process">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/process-3.0.9/lib" />
</list>
</value>
</entry>
<entry key="pub_semver">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/pub_semver-1.4.2/lib" />
</list>
</value>
</entry>
<entry key="quiver">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/quiver-2.0.1/lib" />
</list>
</value>
</entry>
<entry key="sky_engine">
<value>
<list>
<option value="$USER_HOME$/working/flutter/bin/cache/pkg/sky_engine/lib" />
</list>
</value>
</entry>
<entry key="source_span">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/source_span-1.5.4/lib" />
</list>
</value>
</entry>
<entry key="stack_trace">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/stack_trace-1.9.3/lib" />
</list>
</value>
</entry>
<entry key="stream_channel">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/stream_channel-1.6.8/lib" />
</list>
</value>
</entry>
<entry key="string_scanner">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/string_scanner-1.0.4/lib" />
</list>
</value>
</entry>
<entry key="term_glyph">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/term_glyph-1.1.0/lib" />
</list>
</value>
</entry>
<entry key="test_api">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/test_api-0.2.2/lib" />
</list>
</value>
</entry>
<entry key="typed_data">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/typed_data-1.1.6/lib" />
</list>
</value>
</entry>
<entry key="vector_math">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/vector_math-2.0.8/lib" />
</list>
</value>
</entry>
<entry key="vm_service_client">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/vm_service_client-0.2.6/lib" />
</list>
</value>
</entry>
<entry key="web_socket_channel">
<value>
<list>
<option value="$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/web_socket_channel-1.0.9/lib" />
</list>
</value>
</entry>
</option>
</properties>
<CLASSES>
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/async-2.0.8/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/boolean_selector-1.0.4/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/charcode-1.1.2/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/collection-1.14.11/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/convert-2.1.1/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/crypto-2.0.6/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/cupertino_icons-0.1.2/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/file-5.0.7/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/intl-0.15.7/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/json_rpc_2-2.0.9/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/matcher-0.12.3+1/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/meta-1.1.6/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/path-1.6.2/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/pedantic-1.4.0/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/platform-2.2.0/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/process-3.0.9/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/pub_semver-1.4.2/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/quiver-2.0.1/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/source_span-1.5.4/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/stack_trace-1.9.3/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/stream_channel-1.6.8/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/string_scanner-1.0.4/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/term_glyph-1.1.0/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/test_api-0.2.2/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/typed_data-1.1.6/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/vector_math-2.0.8/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/vm_service_client-0.2.6/lib" />
<root url="file://$USER_HOME$/working/flutter/.pub-cache/hosted/pub.flutter-io.cn/web_socket_channel-1.0.9/lib" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/pkg/sky_engine/lib" />
<root url="file://$USER_HOME$/working/flutter/packages/flutter/lib" />
<root url="file://$USER_HOME$/working/flutter/packages/flutter_driver/lib" />
<root url="file://$USER_HOME$/working/flutter/packages/flutter_test/lib" />
<root url="file://$USER_HOME$/working/flutter/packages/fuchsia_remote_debug_protocol/lib" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/web_gl" />
<root url="file://$USER_HOME$/working/flutter/bin/cache/dart-sdk/lib/web_sql" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<component name="libraryTable">
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES />
<JAVADOC />
<SOURCES />
</library>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/transformer_page_view.iml" filepath="$PROJECT_DIR$/transformer_page_view.iml" />
</modules>
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeSettings">
<configurations>
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations>
</component>
<component name="ChangeListManager">
<list default="true" id="da615bec-bd21-494f-ae3e-e28a9fad9952" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/CHANGELOG.md" beforeDir="false" afterPath="$PROJECT_DIR$/CHANGELOG.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/example/pubspec.lock" beforeDir="false" afterPath="$PROJECT_DIR$/example/pubspec.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/lib/transformer_page_view.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/transformer_page_view.dart" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pubspec.lock" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.yaml" afterDir="false" />
</list>
<ignored path="$PROJECT_DIR$/.dart_tool/" />
<ignored path="$PROJECT_DIR$/.idea/" />
<ignored path="$PROJECT_DIR$/.pub/" />
<ignored path="$PROJECT_DIR$/build/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="parallax.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/parallax.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="150">
<caret line="11" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="transformer_page_view.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/transformer_page_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="473" column="9" selection-start-line="473" selection-start-column="9" selection-end-line="473" selection-end-column="9" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="14" selection-start-line="2" selection-start-column="14" selection-end-line="2" selection-end-column="14" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="43" lean-forward="true" selection-start-line="2" selection-start-column="43" selection-end-line="2" selection-end-column="43" />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="framework.dart" pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/framework.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="981">
<caret line="1137" column="30" selection-start-line="1137" selection-start-column="30" selection-end-line="1137" selection-end-column="30" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Dart File" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>viewportDimension</find>
<find>_page</find>
<find>_constraints</find>
<find>SliverConstraints</find>
<find>_renderObject</find>
<find>SliverMultiBoxAdaptorParentData</find>
<find>MySliverFillViewport</find>
<find>RenderSliverMultiBoxAdaptor</find>
<find>offset</find>
<find>print</find>
<find>curve</find>
<find>_currentPixels</find>
<find>reverse</find>
<find>onChangeNotifier</find>
<find>index_controller</find>
<find>_pageController</find>
<find>_buildItem</find>
<find>Random</find>
<find>children</find>
<find>next</find>
<find>loop</find>
<find>itemCount</find>
<find>3</find>
<find>dispose</find>
<find>didUpdateWidget</find>
<find>isNotEmpty</find>
<find>viewportFraction</find>
<find>_size</find>
<find>findRenderObject</find>
<find>setState</find>
</findStrings>
<replaceStrings>
<replace>transformer_page_view</replace>
</replaceStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/dev/bots/travis_install.sh" />
<option value="$PROJECT_DIR$/example/lib/ThreeD.dart" />
<option value="$PROJECT_DIR$/example/lib/DepthPageTransformer.dart" />
<option value="$PROJECT_DIR$/example/test/widget_test.dart" />
<option value="$PROJECT_DIR$/.gitignore" />
<option value="$PROJECT_DIR$/example/lib/WelcomeView.dart" />
<option value="$PROJECT_DIR$/example/pubspec.yaml" />
<option value="$PROJECT_DIR$/example/lib/diary.dart" />
<option value="$PROJECT_DIR$/lib/parallax.dart" />
<option value="$PROJECT_DIR$/example/lib/welcome.dart" />
<option value="$PROJECT_DIR$/example/lib/images.dart" />
<option value="$PROJECT_DIR$/example/lib/DeepthPageTransformer.dart" />
<option value="$PROJECT_DIR$/example/lib/ZoomInPageTransformer.dart" />
<option value="$PROJECT_DIR$/example/lib/ZoomOutPageTransformer.dart" />
<option value="$PROJECT_DIR$/example/lib/ThreeDTransformer.dart" />
<option value="$PROJECT_DIR$/example/lib/FixlistTest.dart" />
<option value="$PROJECT_DIR$/example/lib/AccordionTransformer.dart" />
<option value="$PROJECT_DIR$/lib/transformers.dart" />
<option value="$PROJECT_DIR$/example/lib/ScaleAndFadeTransformer.dart" />
<option value="$PROJECT_DIR$/example/lib/buildin_transformers.dart" />
<option value="$PROJECT_DIR$/README.md" />
<option value="$PROJECT_DIR$/example/lib/zero.dart" />
<option value="$PROJECT_DIR$/lib/index_controller.dart" />
<option value="$PROJECT_DIR$/example/lib/main.dart" />
<option value="$PROJECT_DIR$/example/lib/screens/ProductDetailView.dart" />
<option value="$PROJECT_DIR$/example/lib/CachePageView.dart" />
<option value="$PROJECT_DIR$/test/transformer_page_view_test.dart" />
<option value="$PROJECT_DIR$/example/lib/screens/ProductListView.dart" />
<option value="$PROJECT_DIR$/lib/transformer_page_view.dart" />
<option value="$PROJECT_DIR$/pubspec.yaml" />
<option value="$PROJECT_DIR$/CHANGELOG.md" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="100" />
<option name="y" value="93" />
<option name="width" value="1397" />
<option name="height" value="877" />
</component>
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="transformer_page_view" type="b2602c69:ProjectViewProjectNode" />
<item name="transformer_page_view" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="transformer_page_view" type="b2602c69:ProjectViewProjectNode" />
<item name="transformer_page_view" type="462c0819:PsiDirectoryNode" />
<item name="lib" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
<option name="show-excluded-files" value="false" />
</pane>
<pane id="Scope" />
<pane id="AndroidView" />
<pane id="PackagesPane" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1539840281539" />
<property name="dart.analysis.tool.window.force.activate" value="false" />
<property name="io.flutter.reload.alreadyRun" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="project.structure.last.edited" value="Modules" />
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.side.proportion" value="0.0" />
<property name="settings.editor.selected.configurable" value="dart.settings" />
<property name="show.migrate.to.gradle.popup" value="false" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/example/lib" />
<recent name="$PROJECT_DIR$/example/assets" />
<recent name="$PROJECT_DIR$" />
<recent name="C:\Users\Administrator\AndroidStudioProjects\transformer_page_view\example\assets" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Flutter.main.dart">
<configuration default="true" type="AndroidJUnit" factoryName="Android JUnit">
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" />
<option name="METHOD_NAME" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="singleModule" />
</option>
<patterns />
</configuration>
<configuration default="true" type="AndroidRunConfigurationType" factoryName="Android App">
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
<option name="FORCE_STOP_RUNNING_APP" value="true" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="USE_LAST_SELECTED_DEVICE" value="false" />
<option name="PREFERRED_AVD" value="" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Hybrid>
<Java />
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Sampled (Java)" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY_CLASS" value="" />
<method>
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
<configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Instrumented Tests">
<option name="TESTING_TYPE" value="0" />
<option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
<option name="METHOD_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="EXTRA_OPTIONS" value="" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
<option name="FORCE_STOP_RUNNING_APP" value="true" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="USE_LAST_SELECTED_DEVICE" value="false" />
<option name="PREFERRED_AVD" value="" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Hybrid>
<Java />
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Sampled (Java)" />
</Profilers>
<method>
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
<configuration default="true" type="Application" factoryName="Application">
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
</configuration>
<configuration name="images.dart" type="FlutterRunConfigurationType" factoryName="Flutter" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/example/lib/images.dart" />
</configuration>
<configuration name="main.dart" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="filePath" value="$PROJECT_DIR$/example/lib/main.dart" />
</configuration>
<configuration name="welcome.dart" type="FlutterRunConfigurationType" factoryName="Flutter" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/example/lib/welcome.dart" />
</configuration>
<configuration name="tests in transformer_page_view_test.dart" type="FlutterTestConfigType" factoryName="Flutter Test" temporary="true" nameIsGenerated="true">
<option name="testFile" value="$PROJECT_DIR$/test/transformer_page_view_test.dart" />
</configuration>
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType" factoryName="Kotlin script">
<option name="filePath" />
<option name="vmParameters" />
<option name="alternativeJrePath" />
<option name="programParameters" />
<option name="passParentEnvs" value="true" />
<option name="workingDirectory" />
<option name="isAlternativeJrePathEnabled" value="false" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="MAIN_CLASS_NAME" />
<option name="WORKING_DIRECTORY" />
<module name="" />
<option name="filePath" />
<option name="vmParameters" />
<option name="alternativeJrePath" />
<option name="programParameters" />
<option name="passParentEnvs" value="true" />
<option name="workingDirectory" />
<option name="isAlternativeJrePathEnabled" value="false" />
<option name="VM_PARAMETERS" />
<option name="PROGRAM_PARAMETERS" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="MAIN_CLASS_NAME" />
<option name="WORKING_DIRECTORY" />
</configuration>
<configuration default="true" type="TestNG" factoryName="TestNG">
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="SUITE_NAME" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" />
<option name="METHOD_NAME" />
<option name="GROUP_NAME" />
<option name="TEST_OBJECT" value="CLASS" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
<option name="OUTPUT_DIRECTORY" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="singleModule" />
</option>
<option name="USE_DEFAULT_REPORTERS" value="false" />
<option name="PROPERTIES_FILE" />
<properties />
<listeners />
</configuration>
<configuration name="&lt;template&gt;" type="Applet" default="true" selected="false">
<option name="MAIN_CLASS_NAME" />
<option name="HTML_FILE_NAME" />
<option name="HTML_USED" value="false" />
<option name="WIDTH" value="400" />
<option name="HEIGHT" value="300" />
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
<option name="VM_PARAMETERS" />
</configuration>
<configuration name="&lt;template&gt;" type="JUnit" default="true" selected="false">
<option name="MAIN_CLASS_NAME" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$MODULE_DIR$" />
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit">
<extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
<module name="" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PACKAGE_NAME" />
<option name="MAIN_CLASS_NAME" />
<option name="METHOD_NAME" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="singleModule" />
</option>
<envs />
<patterns />
<method />
</configuration>
<configuration name="&lt;template&gt;" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" default="true" selected="false">
<option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
</configuration>
<list>
<item itemvalue="Flutter.main.dart" />
<item itemvalue="Flutter.images.dart" />
<item itemvalue="Flutter.welcome.dart" />
<item itemvalue="Flutter Test.tests in transformer_page_view_test.dart" />
</list>
<recent_temporary>
<list>
<item itemvalue="Flutter Test.tests in transformer_page_view_test.dart" />
</list>
</recent_temporary>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="da615bec-bd21-494f-ae3e-e28a9fad9952" name="Default" comment="" />
<created>1535548627938</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1535548627938</updated>
</task>
<servers />
</component>
<component name="TestHistory">
<history-entry file="tests_in_transformer_page_view_test_dart - 2018.09.09 at 18h 31m 10s.xml">
<configuration name="tests in transformer_page_view_test.dart" configurationId="FlutterTestConfigType" />
</history-entry>
<history-entry file="tests_in_transformer_page_view_test_dart - 2018.09.19 at 13h 07m 53s.xml">
<configuration name="tests in transformer_page_view_test.dart" configurationId="FlutterTestConfigType" />
</history-entry>
<history-entry file="tests_in_transformer_page_view_test_dart - 2018.09.19 at 13h 35m 16s.xml">
<configuration name="tests in transformer_page_view_test.dart" configurationId="FlutterTestConfigType" />
</history-entry>
<history-entry file="tests_in_transformer_page_view_test_dart - 2018.09.19 at 13h 46m 21s.xml">
<configuration name="tests in transformer_page_view_test.dart" configurationId="FlutterTestConfigType" />
</history-entry>
<history-entry file="tests_in_transformer_page_view_test_dart - 2018.09.30 at 16h 57m 10s.xml">
<configuration name="tests in transformer_page_view_test.dart" configurationId="FlutterTestConfigType" />
</history-entry>
</component>
<component name="TodoView">
<todo-panel id="selected-file">
<is-autoscroll-to-source value="true" />
</todo-panel>
<todo-panel id="all">
<are-packages-shown value="true" />
<is-autoscroll-to-source value="true" />
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="99" y="125" width="1397" height="877" extended-state="0" />
<editor active="true" />
<layout>
<window_info anchor="bottom" id="TODO" order="6" weight="0.32948717" />
<window_info anchor="bottom" id="Messages" order="7" visible="true" weight="0.32480818" />
<window_info anchor="right" id="Palette&#9;" order="3" />
<window_info id="Image Layers" order="2" />
<window_info anchor="right" id="Capture Analysis" order="3" />
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
<window_info anchor="bottom" id="Flutter Performance" order="8" side_tool="true" />
<window_info anchor="bottom" id="Dart Analysis" order="7" weight="0.32480818" />
<window_info anchor="bottom" id="Run" order="2" weight="0.32992327" />
<window_info anchor="bottom" id="Version Control" order="7" weight="0.32948717" />
<window_info anchor="bottom" id="Terminal" order="7" weight="0.32948717" />
<window_info anchor="right" id="Flutter Outline" order="3" weight="0.32941943" />
<window_info id="Capture Tool" order="2" />
<window_info id="Designer" order="2" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.20664206" />
<window_info id="Structure" order="1" side_tool="true" weight="0.24918461" />
<window_info anchor="right" id="Theme Preview" order="3" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.37003842" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="right" id="Flutter Inspector" order="3" visible="true" weight="0.059778597" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Find" order="1" weight="0.3290653" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="Dart">
<url>mock:///liberrors_patch.dart</url>
<line>39</line>
<option name="timeStamp" value="82" />
</line-breakpoint>
<line-breakpoint enabled="true" type="Dart">
<url>file://$PROJECT_DIR$/lib/transformer_page_view.dart</url>
<line>332</line>
<option name="timeStamp" value="97" />
</line-breakpoint>
</breakpoints>
<default-breakpoints>
<breakpoint type="dart-exception">
<properties />
</breakpoint>
</default-breakpoints>
<option name="time" value="98" />
</breakpoint-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/material/app.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="229">
<caret line="438" column="8" selection-start-line="438" selection-start-column="8" selection-end-line="438" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/scroll_position.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1156">
<caret line="579" column="7" selection-start-line="579" selection-start-column="7" selection-end-line="579" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver_list.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="129">
<caret line="197" column="16" lean-forward="true" selection-start-line="197" selection-start-column="16" selection-end-line="197" selection-end-column="16" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver_grid.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-4">
<caret line="96" column="18" lean-forward="true" selection-start-line="96" selection-start-column="18" selection-end-line="96" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/scroll_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="451">
<caret line="1071" column="11" selection-start-line="1071" selection-start-column="11" selection-end-line="1071" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/custom_layout.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="95" column="15" selection-start-line="95" selection-start-column="15" selection-end-line="95" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="720">
<caret line="56" column="46" selection-start-line="56" selection-start-column="36" selection-end-line="56" selection-end-column="46" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="14520">
<caret line="980" column="24" selection-start-line="980" selection-start-column="24" selection-end-line="980" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver_fill.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="28" column="6" selection-start-line="28" selection-start-column="6" selection-end-line="28" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="637">
<caret line="177" column="11" selection-start-line="177" selection-start-column="11" selection-end-line="177" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/sliver.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="157">
<caret line="310" column="61" selection-start-line="310" selection-start-column="61" selection-end-line="310" selection-end-column="61" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/scroll_controller.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="157">
<caret line="226" column="16" selection-start-line="226" selection-start-column="16" selection-end-line="226" selection-end-column="16" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/scrollable.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="27" column="15" selection-start-line="27" selection-start-column="15" selection-end-line="27" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/foundation/diagnostics.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1307">
<caret line="2361" column="15" selection-start-line="2361" selection-start-column="15" selection-end-line="2361" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/viewport.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="1075" column="62" lean-forward="true" selection-start-line="1075" selection-start-column="62" selection-end-line="1075" selection-end-column="62" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/viewport.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="154">
<caret line="168" column="55" selection-start-line="168" selection-start-column="55" selection-end-line="168" selection-end-column="55" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/foundation/change_notifier.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="12" column="15" selection-start-line="12" selection-start-column="15" selection-end-line="12" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/custom_paint.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-478">
<caret line="127" column="15" selection-start-line="127" selection-start-column="15" selection-end-line="127" selection-end-column="15" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/basic.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="642">
<caret line="385" column="8" selection-start-line="385" selection-start-column="8" selection-end-line="385" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/bin/cache/pkg/sky_engine/lib/ui/painting.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-255">
<caret line="2799" column="6" selection-start-line="2799" selection-start-column="6" selection-end-line="2799" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/welcome_back.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="195">
<caret line="17" column="27" lean-forward="true" selection-end-line="131" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/DeepthPageTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="316">
<caret line="51" column="35" lean-forward="true" selection-start-line="51" selection-start-column="35" selection-end-line="51" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/ZoomInPageTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="316">
<caret line="51" column="36" selection-start-line="51" selection-start-column="36" selection-end-line="51" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/ZoomOutPageTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="322">
<caret line="51" column="36" selection-start-line="51" selection-start-column="36" selection-end-line="51" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/ThreeDTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="316">
<caret line="51" column="34" selection-start-line="51" selection-start-column="34" selection-end-line="51" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/FixlistTest.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="198">
<caret line="76" column="38" lean-forward="true" selection-start-line="76" selection-start-column="38" selection-end-line="76" selection-end-column="38" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/transformers.dart" />
<entry file="file://$PROJECT_DIR$/example/lib/ScaleAndFadeTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="690">
<caret line="51" column="40" selection-start-line="51" selection-start-column="40" selection-end-line="51" selection-end-column="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/buildin_transformers.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2385">
<caret line="163" column="23" selection-start-line="163" selection-start-column="23" selection-end-line="163" selection-end-column="23" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/page_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="315">
<caret line="44" column="32" selection-start-line="42" selection-start-column="4" selection-end-line="44" selection-end-column="32" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/welcome.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="900">
<caret line="64" column="2" selection-start-line="64" selection-start-column="2" selection-end-line="64" selection-end-column="2" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/bin/cache/pkg/sky_engine/lib/core/list.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="154">
<caret line="305" column="10" selection-start-line="305" selection-start-column="10" selection-end-line="305" selection-end-column="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/zero.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="8" column="34" lean-forward="true" selection-start-line="8" selection-start-column="34" selection-end-line="8" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pubspec.lock">
<provider selected="true" editor-type-id="text-editor">
<state />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/pubspec.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" selection-start-line="2" selection-end-line="2" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/index_controller.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105">
<caret line="7" column="34" selection-start-line="7" selection-start-column="34" selection-end-line="7" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/AccordionTransformer.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="480">
<caret line="37" column="11" selection-start-line="37" selection-start-column="11" selection-end-line="37" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/material/page.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="154">
<caret line="43" column="2" selection-start-line="43" selection-start-column="2" selection-end-line="43" selection-end-column="2" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/screens/ProductDetailView.dart">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="7" selection-start-column="7" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/CachePageView.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-41">
<caret line="80" column="6" selection-start-line="80" selection-start-column="6" selection-end-line="80" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/transformer_page_view_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="39" selection-start-column="39" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/images.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="184">
<caret line="52" column="36" selection-start-line="52" selection-start-column="36" selection-end-line="52" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/screens/ProductListView.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="208">
<caret line="29" column="37" selection-start-line="29" selection-start-column="37" selection-end-line="29" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="812">
<caret line="98" column="34" selection-start-line="98" selection-start-column="34" selection-end-line="98" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/rendering/object.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="31305">
<caret line="2106" column="6" selection-start-line="2106" selection-start-column="2" selection-end-line="2106" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="525">
<caret line="35" column="6" selection-start-line="35" selection-start-column="6" selection-end-line="35" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/parallax.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="150">
<caret line="11" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/working/flutter/packages/flutter/lib/src/widgets/framework.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="981">
<caret line="1137" column="30" selection-start-line="1137" selection-start-column="30" selection-end-line="1137" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/transformer_page_view.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="473" column="9" selection-start-line="473" selection-start-column="9" selection-end-line="473" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="14" selection-start-line="2" selection-start-column="14" selection-end-line="2" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="43" lean-forward="true" selection-start-line="2" selection-start-column="43" selection-end-line="2" selection-end-column="43" />
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ArtifactsStructureConfigurable.UI">
<settings>
<artifact-editor />
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="FacetStructureConfigurable.UI">
<settings>
<last-edited>No facets are configured</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="GlobalLibrariesConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="JdkListConfigurable.UI">
<settings>
<last-edited>1.8</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ModuleStructureConfigurable.UI">
<settings>
<last-edited>transformer_page_view</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
<option value="0.6" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ProjectLibrariesConfigurable.UI">
<settings>
<last-edited>Dart Packages</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>
\ No newline at end of file
language: dart
env:
- SHARD=dartfmt
- SHARD=test
install:
- ./dev/bots/travis_install.sh
script:
- ./dev/bots/travis_script.sh
after_success:
- coveralls-lcov coverage/lcov.info
\ No newline at end of file
## [0.1.6] - [2019.03.22]
* Fix setState() called after dispose()
## [0.1.5] - [2019.03.10]
* Fix findRenderObject is null
## [0.1.4] - [2018.10.19]
* Fix display items when itemCount changes
## [0.1.3] - [2018.10.18]
* Fix zero item count
## [0.1.1] - [2018.10.10]
* Fix next/previous index in none loop mode.
## [0.1.0] - [2018.10.08]
* Implement `TransformerPageController`
## [0.0.8] - [2018.09.20]
* Ignore not valid event
## [0.0.7] - [2018.09.20]
* Fix bugs
## [0.0.6] - [2018.09.20]
* Fix bugs
## [0.0.5] - [2018.09.19]
* Fix bugs
## [0.0.4] - [2018.09.19]
* Fix bugs
## [0.0.2] - [2018.08.30]
* Update readme
## [0.0.1] - [2018.08.30]
* Basic animation
TODO: Add your license here.
<p align="center">
<a href="https://travis-ci.org/best-flutter/transformer_page_view">
<img src="https://travis-ci.org/best-flutter/transformer_page_view.svg?branch=master" alt="Build Status" />
</a>
<a href="https://github.com/best-flutter/transformer_page_view/pulls">
<img src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg" alt="PRs Welcome" />
</a>
<a href="https://pub.dartlang.org/packages/transformer_page_view">
<img src="https://img.shields.io/pub/v/transformer_page_view.svg" alt="pub package" />
</a>
</p>
# transformer_page_view
PageTransformer for flutter
## Very simple to use
```
import 'package:transformer_page_view/transformer_page_view.dart';
...
new TransformerPageView(
loop: true,
transformer: new AccordionTransformer(),
itemBuilder: (BuildContext context, int index) {
return new Container(
color: list[index%list.length],
child: new Center(
child: new Text("$index",style: new TextStyle(fontSize: 80.0,color: Colors.white),),
),
);
},
itemCount: 3)
```
Almost the same as PageView.builder, simplely specify a `transformer` to `TransformerPageView`,
which is a sub class of `PageTransformer`
## Show cases
### Parallax
![Welcome view](https://github.com/jzoom/images/raw/master/welcome.gif)
### Basic
![AccordionTransformer](https://github.com/jzoom/images/raw/master/AccordionTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/AccordionTransformer.dart)
![ThreeDTransformer](https://github.com/jzoom/images/raw/master/ThreeDTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/ThreeDTransformer.dart)
![ScaleAndFadeTransformer](https://github.com/jzoom/images/raw/master/ScaleAndFadeTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/ScaleAndFadeTransformers.dart)
![ZoomInPageTransformer](https://github.com/jzoom/images/raw/master/ZoomInPageTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/ZoomInPageTransformer.dart)
![ZoomOutPageTransformer](https://github.com/jzoom/images/raw/master/ZoomOutPageTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/ZoomOutPageTransformer.dart)
![DepthPageTransformer](https://github.com/jzoom/images/raw/master/DepthPageTransformer.gif)
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/DepthPageTransformers.dart)
## Getting Started
- [Installation](#installation)
- [Basic Usage](#basic-usage)
- [Build-in Parallax](#build-in-parallax)
- [Custom animation](#custom-animation)
### Installation
Add
```bash
transformer_page_view:
```
to your pubspec.yaml ,and run
```bash
flutter packages get
```
in your project's root directory.
### Basic Usage
| Parameter | Default | Description |
| :------------ |:---------------:| :-----|
| scrollDirection | Axis.horizontal | If `Axis.horizontal`, the scroll view's children are arranged horizontally in a row instead of vertically in a column. |
| loop | false |Set to `true` to enable continuous loop mode. |
| index | none | Index number of initial slide. if not set , it is controlled by the widget itself,otherwise, it is controlled by another widget, which is returned by `itemBuilder`|
| onPageChanged | void onPageChanged(int index) | Called with the new index when the user swiped |
| duration | new Duration(milliseconds:300) | The milliseconds of every transaction animation costs |
| transformer | none | The most important property of this widget, it returns a `transformed` widget that based on the widget parameter. If the value is null, a `itemBuilder` must be specified |
| itemCount | none | Number of the total items |
| itemBuilder | none | A function that returns a widget based on index,if it's null,a `transformer` must be specified |
### Build-in Parallax
We provide 3 build-in parallaxes, which handle color、image and container
> ParallaxColor
ParallaxColor handles the color transform, which controls the color transform from one to another.
> ParallaxImage
ParallaxImage handles the image, which speed is slower than the `PageView`
> ParallaxContainer
ParallaxContainer handles the text or other staff, which speed is faster than the `PageView`
3 build-in parallaxes are all used in subclass of `PageTransform`,group these parallaxes together, we can create very cool things.
![](https://github.com/jzoom/images/raw/master/beauty.gif)
Inspired by [page-transformer](https://github.com/roughike/page-transformer), and we have an easier way to create this.
>See code [here](https://github.com/best-flutter/transformer_page_view/blob/master/example/lib/images.dart)
### Custom animation
#!/bin/bash
echo "$PWD"
export ROOT="$PWD"
mkdir ~/development
cd ~/development
wget https://storage.googleapis.com/flutter_infra/releases/beta/linux/flutter_linux_v0.6.0-beta.tar.xz
tar xf ~/development/flutter_linux_v0.6.0-beta.tar.xz
export PATH=~/development/flutter/bin:$PATH
cd $ROOT
flutter packages get
gem install coveralls-lcov
#!/bin/bash
set -ex
export PATH=~/development/flutter/bin:$PATH
export ROOT="$PWD"
if [[ "$SHARD" == "dartfmt" ]]; then
echo 'Formating code'
cd $ROOT
flutter format . || exit $?
else
# tests shard
cd $ROOT
flutter test --coverage test/* || exit $?
fi
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
class IndexController extends ChangeNotifier {
static const int NEXT = 1;
static const int PREVIOUS = -1;
static const int MOVE = 0;
late Completer _completer;
int? index;
late bool animation;
int? event;
Future move(int index, {bool animation: true}) {
this.animation = animation;
this.index = index;
this.event = MOVE;
_completer = new Completer();
notifyListeners();
return _completer.future;
}
Future next({bool animation: true}) {
this.event = NEXT;
this.animation = animation;
_completer = new Completer();
notifyListeners();
return _completer.future;
}
Future previous({bool animation: true}) {
this.event = PREVIOUS;
this.animation = animation;
_completer = new Completer();
notifyListeners();
return _completer.future;
}
void complete() {
if (!_completer.isCompleted) {
_completer.complete();
}
}
}
import 'package:flutter/widgets.dart';
import 'package:transformer_page_view/transformer_page_view.dart';
typedef void PaintCallback(Canvas canvas, Size siz);
class ColorPainter extends CustomPainter {
final Paint _paint;
final TransformInfo info;
final List<Color> colors;
ColorPainter(this._paint, this.info, this.colors);
@override
void paint(Canvas canvas, Size size) {
int index = info.fromIndex!;
_paint.color = colors[index];
canvas.drawRect(
new Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint);
if (info.done!) {
return;
}
int alpha;
int color;
double opacity;
double? position = info.position;
if (info.forward!) {
if (index < colors.length - 1) {
color = colors[index + 1].value & 0x00ffffff;
opacity = (position! <= 0
? (-position / info.viewportFraction!)
: 1 - position / info.viewportFraction!);
if (opacity > 1) {
opacity -= 1.0;
}
if (opacity < 0) {
opacity += 1.0;
}
alpha = (0xff * opacity).toInt();
_paint.color = new Color((alpha << 24) | color);
canvas.drawRect(
new Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint);
}
} else {
if (index > 0) {
color = colors[index - 1].value & 0x00ffffff;
opacity = (position! > 0
? position / info.viewportFraction!
: (1 + position / info.viewportFraction!));
if (opacity > 1) {
opacity -= 1.0;
}
if (opacity < 0) {
opacity += 1.0;
}
alpha = (0xff * opacity).toInt();
_paint.color = new Color((alpha << 24) | color);
canvas.drawRect(
new Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint);
}
}
}
@override
bool shouldRepaint(ColorPainter oldDelegate) {
return oldDelegate.info != info;
}
}
class _ParallaxColorState extends State<ParallaxColor> {
Paint paint = new Paint();
@override
Widget build(BuildContext context) {
return new CustomPaint(
painter: new ColorPainter(paint, widget.info, widget.colors),
child: widget.child,
);
}
}
class ParallaxColor extends StatefulWidget {
final Widget child;
final List<Color> colors;
final TransformInfo info;
ParallaxColor({
required this.colors,
required this.info,
required this.child,
});
@override
State<StatefulWidget> createState() {
return new _ParallaxColorState();
}
}
class ParallaxContainer extends StatelessWidget {
final Widget child;
final double position;
final double translationFactor;
final double opacityFactor;
ParallaxContainer(
{required this.child,
required this.position,
this.translationFactor: 100.0,
this.opacityFactor: 1.0});
@override
Widget build(BuildContext context) {
return Opacity(
opacity: (1 - position.abs()).clamp(0.0, 1.0) * opacityFactor,
child: new Transform.translate(
offset: new Offset(position * translationFactor, 0.0),
child: child,
),
);
}
}
class ParallaxImage extends StatelessWidget {
final Image image;
final double imageFactor;
ParallaxImage.asset(String name, {required double position, this.imageFactor: 0.3})
: image = Image.asset(name,
fit: BoxFit.cover,
alignment: FractionalOffset(
0.5 + position * imageFactor,
0.5,
));
@override
Widget build(BuildContext context) {
return image;
}
}
library transformer_page_view;
import 'package:flutter/widgets.dart';
import 'package:transformer_page_view/index_controller.dart';
export 'package:transformer_page_view/index_controller.dart';
export 'package:transformer_page_view/parallax.dart';
///
/// NOTICE::
///
/// In order to make package smaller,currently we're not supporting any build-in page transformers
/// You can find build in transforms here:
///
///
///
const int kMaxValue = 2000000000;
const int kMiddleValue = 1000000000;
/// Default auto play transition duration (in millisecond)
const int kDefaultTransactionDuration = 300;
class TransformInfo {
/// The `width` of the `TransformerPageView`
final double? width;
/// The `height` of the `TransformerPageView`
final double? height;
/// The `position` of the widget pass to [PageTransformer.transform]
/// A `position` describes how visible the widget is.
/// The widget in the center of the screen' which is full visible, position is 0.0.
/// The widge in the left ,may be hidden, of the screen's position is less than 0.0, -1.0 when out of the screen.
/// The widge in the right ,may be hidden, of the screen's position is greater than 0.0, 1.0 when out of the screen
///
///
final double? position;
/// The `index` of the widget pass to [PageTransformer.transform]
final int? index;
/// The `activeIndex` of the PageView
final int? activeIndex;
/// The `activeIndex` of the PageView, from user start to swipe
/// It will change when user end drag
final int? fromIndex;
/// Next `index` is greater than this `index`
final bool? forward;
/// User drag is done.
final bool? done;
/// Same as [TransformerPageView.viewportFraction]
final double? viewportFraction;
/// Copy from [TransformerPageView.scrollDirection]
final Axis? scrollDirection;
TransformInfo(
{this.index,
this.position,
this.width,
this.height,
this.activeIndex,
this.fromIndex,
this.forward,
this.done,
this.viewportFraction,
this.scrollDirection});
}
abstract class PageTransformer {
///
final bool reverse;
PageTransformer({this.reverse: false});
/// Return a transformed widget, based on child and TransformInfo
Widget transform(Widget child, TransformInfo info);
}
typedef Widget PageTransformerBuilderCallback(Widget child, TransformInfo info);
class PageTransformerBuilder extends PageTransformer {
final PageTransformerBuilderCallback builder;
PageTransformerBuilder({bool reverse: false, required this.builder})
: super(reverse: reverse);
@override
Widget transform(Widget child, TransformInfo info) {
return builder(child, info);
}
}
class TransformerPageController extends PageController {
final bool loop;
final int? itemCount;
final bool reverse;
TransformerPageController({
int? initialPage = 0,
bool keepPage = true,
double viewportFraction = 1.0,
this.loop: false,
this.itemCount,
this.reverse: false,
}) : super(
initialPage: TransformerPageController._getRealIndexFromRenderIndex(
initialPage ?? 0, loop, itemCount, reverse)!,
keepPage: keepPage,
viewportFraction: viewportFraction);
int? getRenderIndexFromRealIndex(num? index) {
return _getRenderIndexFromRealIndex(index, loop, itemCount, reverse);
}
int? getRealItemCount() {
if (itemCount == 0) return 0;
return loop ? itemCount! + kMaxValue : itemCount;
}
static _getRenderIndexFromRealIndex(
num? index, bool loop, int? itemCount, bool reverse) {
if (itemCount == 0) return 0;
int? renderIndex;
if (loop) {
renderIndex = index! - kMiddleValue as int?;
renderIndex = renderIndex! % itemCount!;
if (renderIndex < 0) {
renderIndex += itemCount;
}
} else {
renderIndex = index as int?;
}
if (reverse) {
renderIndex = itemCount! - renderIndex! - 1;
}
return renderIndex;
}
double? get realPage {
double? page;
if (position.minScrollExtent == null) {
page = 0.0;
} else {
page = super.page;
}
return page;
}
static _getRenderPageFromRealPage(
double? page, bool loop, int? itemCount, bool reverse) {
double? renderPage;
if (loop) {
renderPage = page! - kMiddleValue;
renderPage = renderPage % itemCount!;
if (renderPage < 0) {
renderPage += itemCount;
}
} else {
renderPage = page;
}
if (reverse) {
renderPage = itemCount! - renderPage! - 1;
}
return renderPage;
}
double? get page {
return loop
? _getRenderPageFromRealPage(realPage, loop, itemCount, reverse)
: realPage;
}
int? getRealIndexFromRenderIndex(num? index) {
return _getRealIndexFromRenderIndex(index, loop, itemCount, reverse);
}
static int? _getRealIndexFromRenderIndex(
num? index, bool loop, int? itemCount, bool reverse) {
int? result = (reverse ? itemCount! - index! - 1 as int? : index as int?)??0;
if (loop) {
result += kMiddleValue;
}
return result;
}
}
class TransformerPageView extends StatefulWidget {
/// Create a `transformed` widget base on the widget that has been passed to the [PageTransformer.transform].
/// See [TransformInfo]
///
final PageTransformer? transformer;
/// Same as [PageView.scrollDirection]
///
/// Defaults to [Axis.horizontal].
final Axis scrollDirection;
/// Same as [PageView.physics]
final ScrollPhysics? physics;
/// Set to false to disable page snapping, useful for custom scroll behavior.
/// Same as [PageView.pageSnapping]
final bool pageSnapping;
/// Called whenever the page in the center of the viewport changes.
/// Same as [PageView.onPageChanged]
final ValueChanged<int?>? onPageChanged;
final IndexedWidgetBuilder? itemBuilder;
// See [IndexController.mode],[IndexController.next],[IndexController.previous]
final IndexController? controller;
/// Animation duration
final Duration duration;
/// Animation curve
final Curve curve;
final TransformerPageController? pageController;
/// Set true to open infinity loop mode.
final bool loop;
/// This value is only valid when `pageController` is not set,
final int itemCount;
/// This value is only valid when `pageController` is not set,
final double viewportFraction;
/// If not set, it is controlled by this widget.
final int? index;
/// Creates a scrollable list that works page by page using widgets that are
/// created on demand.
///
/// This constructor is appropriate for page views with a large (or infinite)
/// number of children because the builder is called only for those children
/// that are actually visible.
///
/// Providing a non-null [itemCount] lets the [PageView] compute the maximum
/// scroll extent.
///
/// [itemBuilder] will be called only with indices greater than or equal to
/// zero and less than [itemCount].
TransformerPageView({
Key? key,
this.index,
Duration? duration,
this.curve: Curves.ease,
this.viewportFraction: 1.0,
this.loop: false,
this.scrollDirection = Axis.horizontal,
this.physics,
this.pageSnapping = true,
this.onPageChanged,
this.controller,
this.transformer,
this.itemBuilder,
this.pageController,
required this.itemCount,
}) : assert(itemCount == 0 || itemBuilder != null || transformer != null),
this.duration =
duration ?? new Duration(milliseconds: kDefaultTransactionDuration),
super(key: key);
factory TransformerPageView.children(
{Key? key,
int? index,
Duration? duration,
Curve curve: Curves.ease,
double viewportFraction: 1.0,
bool loop: false,
Axis scrollDirection = Axis.horizontal,
ScrollPhysics? physics,
bool pageSnapping = true,
required ValueChanged<int?> onPageChanged,
IndexController? controller,
PageTransformer? transformer,
required List<Widget> children,
TransformerPageController? pageController}) {
return new TransformerPageView(
itemCount: children.length,
itemBuilder: (BuildContext context, int index) {
return children[index];
},
pageController: pageController,
transformer: transformer,
pageSnapping: pageSnapping,
key: key,
index: index,
duration: duration,
curve: curve,
viewportFraction: viewportFraction,
scrollDirection: scrollDirection,
physics: physics,
onPageChanged: onPageChanged,
controller: controller,
);
}
@override
State<StatefulWidget> createState() {
return new _TransformerPageViewState();
}
static int? getRealIndexFromRenderIndex(
{required bool reverse, int? index, int? itemCount, required bool loop}) {
int? initPage = (reverse ? (itemCount! - index! - 1) : index)??0;
if (loop) {
initPage += kMiddleValue;
}
return initPage;
}
static PageController createPageController(
{required bool reverse,
int? index,
int? itemCount,
required bool loop,
required double viewportFraction}) {
return new PageController(
initialPage: getRealIndexFromRenderIndex(
reverse: reverse, index: index, itemCount: itemCount, loop: loop)!,
viewportFraction: viewportFraction);
}
}
class _TransformerPageViewState extends State<TransformerPageView> {
Size? _size;
int? _activeIndex;
double? _currentPixels;
bool _done = false;
///This value will not change until user end drag.
int? _fromIndex;
PageTransformer? _transformer;
TransformerPageController? _pageController;
Widget _buildItemNormal(BuildContext context, int index) {
int renderIndex = _pageController!.getRenderIndexFromRealIndex(index)!;
Widget child = widget.itemBuilder!(context, renderIndex);
return child;
}
Widget _buildItem(BuildContext context, int index) {
return new AnimatedBuilder(
animation: _pageController!,
builder: (BuildContext c, Widget? w) {
int? renderIndex = _pageController!.getRenderIndexFromRealIndex(index);
Widget? child;
if (widget.itemBuilder != null) {
child = widget.itemBuilder!(context, renderIndex!);
}
if (child == null) {
child = new Container();
}
if (_size == null) {
return child;
}
double position;
double? page = _pageController!.realPage;
if (_transformer!.reverse) {
position = page! - index;
} else {
position = index - page!;
}
position *= widget.viewportFraction;
TransformInfo info = new TransformInfo(
index: renderIndex,
width: _size!.width,
height: _size!.height,
position: position.clamp(-1.0, 1.0),
activeIndex:
_pageController!.getRenderIndexFromRealIndex(_activeIndex),
fromIndex: _fromIndex,
forward: _pageController!.position.pixels - _currentPixels! >= 0,
done: _done,
scrollDirection: widget.scrollDirection,
viewportFraction: widget.viewportFraction);
return _transformer!.transform(child, info);
});
}
double? _calcCurrentPixels() {
_currentPixels = _pageController!.getRenderIndexFromRealIndex(_activeIndex)! *
_pageController!.position.viewportDimension *
widget.viewportFraction;
// print("activeIndex:$_activeIndex , pix:$_currentPixels");
return _currentPixels;
}
@override
Widget build(BuildContext context) {
IndexedWidgetBuilder builder =
_transformer == null ? _buildItemNormal : _buildItem;
Widget child = new PageView.builder(
itemBuilder: builder,
itemCount: _pageController!.getRealItemCount(),
onPageChanged: _onIndexChanged,
controller: _pageController,
scrollDirection: widget.scrollDirection,
physics: widget.physics,
pageSnapping: widget.pageSnapping,
reverse: _pageController!.reverse,
);
if (_transformer == null) {
return child;
}
return new NotificationListener(
onNotification: (ScrollNotification notification) {
if (notification is ScrollStartNotification) {
_calcCurrentPixels();
_done = false;
_fromIndex = _activeIndex;
} else if (notification is ScrollEndNotification) {
_calcCurrentPixels();
_fromIndex = _activeIndex;
_done = true;
}
return false;
},
child: child);
}
void _onIndexChanged(int index) {
_activeIndex = index;
if (widget.onPageChanged != null) {
widget.onPageChanged!(_pageController!.getRenderIndexFromRealIndex(index));
}
}
void _onGetSize(_) {
Size? size;
if (context == null) {
onGetSize(size);
return;
}
RenderObject? renderObject = context.findRenderObject();
if (renderObject != null) {
Rect bounds = renderObject.paintBounds;
size = bounds.size;
}
_calcCurrentPixels();
onGetSize(size);
}
void onGetSize(Size? size) {
if(mounted){
setState(() {
_size = size;
});
}
}
@override
void initState() {
_transformer = widget.transformer;
// int index = widget.index ?? 0;
_pageController = widget.pageController;
if (_pageController == null) {
_pageController = new TransformerPageController(
initialPage: widget.index,
itemCount: widget.itemCount,
loop: widget.loop,
reverse:
widget.transformer == null ? false : widget.transformer!.reverse);
}
// int initPage = _getRealIndexFromRenderIndex(index);
// _pageController = new PageController(initialPage: initPage,viewportFraction: widget.viewportFraction);
_fromIndex = _activeIndex = _pageController!.initialPage;
_controller = getNotifier();
if (_controller != null) {
_controller!.addListener(onChangeNotifier);
}
super.initState();
}
@override
void didUpdateWidget(TransformerPageView oldWidget) {
_transformer = widget.transformer;
int index = widget.index ?? 0;
bool created = false;
if (_pageController != widget.pageController) {
if (widget.pageController != null) {
_pageController = widget.pageController;
} else {
created = true;
_pageController = new TransformerPageController(
initialPage: widget.index,
itemCount: widget.itemCount,
loop: widget.loop,
reverse: widget.transformer == null
? false
: widget.transformer!.reverse);
}
}
if (_pageController!.getRenderIndexFromRealIndex(_activeIndex) != index) {
_fromIndex = _activeIndex = _pageController!.initialPage;
if (!created) {
int initPage = _pageController!.getRealIndexFromRenderIndex(index)!;
_pageController!.animateToPage(initPage,
duration: widget.duration, curve: widget.curve);
}
}
if (_transformer != null)
WidgetsBinding.instance!.addPostFrameCallback(_onGetSize);
if (_controller != getNotifier()) {
if (_controller != null) {
_controller!.removeListener(onChangeNotifier);
}
_controller = getNotifier();
if (_controller != null) {
_controller!.addListener(onChangeNotifier);
}
}
super.didUpdateWidget(oldWidget);
}
@override
void didChangeDependencies() {
if (_transformer != null)
WidgetsBinding.instance!.addPostFrameCallback(_onGetSize);
super.didChangeDependencies();
}
ChangeNotifier? getNotifier() {
return widget.controller;
}
int _calcNextIndex(bool next) {
int? currentIndex = _activeIndex??0;
if (_pageController!.reverse) {
if (next) {
currentIndex--;
} else {
currentIndex++;
}
} else {
if (next) {
currentIndex++;
} else {
currentIndex--;
}
}
if (!_pageController!.loop) {
if (currentIndex >= _pageController!.itemCount!) {
currentIndex = 0;
} else if (currentIndex < 0) {
currentIndex = _pageController!.itemCount! - 1;
}
}
return currentIndex;
}
void onChangeNotifier() {
int? event = widget.controller!.event;
int? index;
switch (event) {
case IndexController.MOVE:
{
index = _pageController!
.getRealIndexFromRenderIndex(widget.controller!.index);
}
break;
case IndexController.PREVIOUS:
case IndexController.NEXT:
{
index = _calcNextIndex(event == IndexController.NEXT);
}
break;
default:
//ignore this event
return;
}
if (widget.controller!.animation) {
_pageController!
.animateToPage(index!,
duration: widget.duration, curve: widget.curve)
.whenComplete(widget.controller!.complete);
} else {
_pageController!.jumpToPage(index!);
widget.controller!.complete();
}
}
ChangeNotifier? _controller;
void dispose() {
super.dispose();
if (_controller != null) {
_controller!.removeListener(onChangeNotifier);
}
}
}
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
async:
dependency: transitive
description:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.8.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.15.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.1"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
file:
dependency: transitive
description:
name: file
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.2"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_driver:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
fuchsia_remote_debug_protocol:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.7.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.0"
process:
dependency: transitive
description:
name: process
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.2.3"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
sync_http:
dependency: transitive
description:
name: sync_http
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.2"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
vm_service:
dependency: transitive
description:
name: vm_service
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.1.1"
webdriver:
dependency: transitive
description:
name: webdriver
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.0"
sdks:
dart: ">=2.12.0 <3.0.0"
name: transformer_page_view
description: PageTransformer for flutter
version: 0.1.6
homepage: https://github.com/jzoom/transformer_page_view
environment:
sdk: '>=2.12.0 <3.0.0'
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter
flutter:
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:transformer_page_view/transformer_page_view.dart';
void main() {
testWidgets('TransformerPageView basic usage', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MaterialApp(
home: new TransformerPageView(
itemBuilder: (context, index) {
return Text("0");
},
itemCount: 10)));
expect(find.text("0", skipOffstage: false), findsOneWidget);
});
testWidgets('Zero item count ', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MaterialApp(
home: new TransformerPageView(
transformer: new PageTransformerBuilder(
builder: (Widget child, TransformInfo info) {
return new Container(
child: new Text("0"),
);
}),
itemCount: 0)));
expect(find.text("0", skipOffstage: false), findsNothing);
});
testWidgets('TransformerPageView transformer only',
(WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MaterialApp(
home: new TransformerPageView(
transformer: new PageTransformerBuilder(
builder: (Widget child, TransformInfo info) {
return new Container(
child: new Text("0"),
);
}),
itemCount: 10)));
// expect(find.text("0", skipOffstage: false), findsOneWidget);
});
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new ScaleAndFadeTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new AccordionTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new ZoomInPageTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new ZoomOutPageTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new ThreeDTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
// testWidgets('TransformerPageView animations', (WidgetTester tester) async {
// // Build our app and trigger a frame.
// await tester.pumpWidget(MaterialApp(
// home: new TransformerPageView(
// transformer: new DeepthPageTransformer(),
// itemBuilder: (context, index) {
// return Text("0");
// },
// itemCount: 10)));
//
// expect(find.text("0", skipOffstage: false), findsOneWidget);
// });
//
testWidgets('TransformerPageView controller', (WidgetTester tester) async {
// Build our app and trigger a frame.
IndexController controller = new IndexController();
await tester.pumpWidget(MaterialApp(
home: new TransformerPageView(
controller: controller,
transformer: new FackTransformer(),
itemBuilder: (context, index) {
print("===================build:$index");
return Text("$index");
},
itemCount: 10)));
expect(find.text("0"), findsOneWidget);
await controller.next(animation: false);
expect(find.text("0"), findsOneWidget);
await controller.previous(animation: false);
expect(find.text("0"), findsOneWidget);
await controller.move(2, animation: false);
expect(find.text("0"), findsOneWidget);
});
}
class FackTransformer extends PageTransformer {
@override
Widget transform(Widget child, TransformInfo info) {
return child;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/.idea" />
<excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/example/build" />
<excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
</content>
<orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Flutter Plugins" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment