diff --git a/example/assets/icons/ic_gauge_chart.svg b/example/assets/icons/ic_gauge_chart.svg
new file mode 100644
index 000000000..0147dab82
--- /dev/null
+++ b/example/assets/icons/ic_gauge_chart.svg
@@ -0,0 +1,3 @@
+
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index 73a295ecb..395ff459e 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -25,11 +25,11 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios"
SPEC CHECKSUMS:
- Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
- package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
-PODFILE CHECKSUM: 0dbd5a87e0ace00c9610d2037ac22083a01f861d
+PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011
COCOAPODS: 1.16.2
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index dd83b3827..60a4e286a 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -8,25 +8,14 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3A769574DE769ECF798B0709 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
- E74A93EDB2B26BA3B68EB856 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66E5FD19F03E6633F69A2755 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
-/* Begin PBXContainerItemProxy section */
- 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 97C146E61CF9000F007C117D /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 97C146ED1CF9000F007C117D;
- remoteInfo = Runner;
- };
-/* End PBXContainerItemProxy section */
-
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
@@ -43,15 +32,12 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 2533C9FF039E091768C02A3C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
- 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 66E5FD19F03E6633F69A2755 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 70B7C328B4B2F1CF5A8F4CD5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 92784C7839A21A123BE5F569 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -59,7 +45,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- FDA57114F6B1B00C26C17AEA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ A5FD4176E495AE357451309C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ F92DACD635C19D794086368F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -67,19 +54,29 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- E74A93EDB2B26BA3B68EB856 /* Pods_Runner.framework in Frameworks */,
+ 3A769574DE769ECF798B0709 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ 387A47388B1D7AAF78141AE7 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 380B38C853A9B1A4CE259991 /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 87E9D592125921BB4FA5096E /* Pods */ = {
isa = PBXGroup;
children = (
- 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ 70B7C328B4B2F1CF5A8F4CD5 /* Pods-Runner.debug.xcconfig */,
+ F92DACD635C19D794086368F /* Pods-Runner.release.xcconfig */,
+ A5FD4176E495AE357451309C /* Pods-Runner.profile.xcconfig */,
);
- path = RunnerTests;
+ path = Pods;
sourceTree = "";
};
9740EEB11CF90186004384FC /* Flutter */ = {
@@ -99,9 +96,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
- 331C8082294A63A400263BE5 /* RunnerTests */,
- B5EDA2152F3EE166ACB0102F /* Pods */,
- F62F59B1CB0A3441A4333BCE /* Frameworks */,
+ 87E9D592125921BB4FA5096E /* Pods */,
+ 387A47388B1D7AAF78141AE7 /* Frameworks */,
);
sourceTree = "";
};
@@ -109,7 +105,6 @@
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
- 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "";
@@ -129,56 +124,21 @@
path = Runner;
sourceTree = "";
};
- B5EDA2152F3EE166ACB0102F /* Pods */ = {
- isa = PBXGroup;
- children = (
- 92784C7839A21A123BE5F569 /* Pods-Runner.debug.xcconfig */,
- FDA57114F6B1B00C26C17AEA /* Pods-Runner.release.xcconfig */,
- 2533C9FF039E091768C02A3C /* Pods-Runner.profile.xcconfig */,
- );
- path = Pods;
- sourceTree = "";
- };
- F62F59B1CB0A3441A4333BCE /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- 66E5FD19F03E6633F69A2755 /* Pods_Runner.framework */,
- );
- name = Frameworks;
- sourceTree = "";
- };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 331C8080294A63A400263BE5 /* RunnerTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
- buildPhases = (
- 331C807D294A63A400263BE5 /* Sources */,
- 331C807F294A63A400263BE5 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- 331C8086294A63A400263BE5 /* PBXTargetDependency */,
- );
- name = RunnerTests;
- productName = RunnerTests;
- productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- 1474CFBDFB72840D91CF260E /* [CP] Check Pods Manifest.lock */,
+ B16E897CCC57E0F4B2344803 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- 654E70DC308C8EF6E1C50DAB /* [CP] Embed Pods Frameworks */,
+ 00C61598CDE2223281B7DB47 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -195,14 +155,9 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
- 331C8080294A63A400263BE5 = {
- CreatedOnToolsVersion = 14.0;
- TestTargetID = 97C146ED1CF9000F007C117D;
- };
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
@@ -223,19 +178,11 @@
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
- 331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
- 331C807F294A63A400263BE5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -250,26 +197,21 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 1474CFBDFB72840D91CF260E /* [CP] Check Pods Manifest.lock */ = {
+ 00C61598CDE2223281B7DB47 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
+ name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
@@ -288,49 +230,46 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
- 654E70DC308C8EF6E1C50DAB /* [CP] Embed Pods Frameworks */ = {
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ inputPaths = (
);
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ name = "Run Script";
+ outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
- 9740EEB61CF901F6004384FC /* Run Script */ = {
+ B16E897CCC57E0F4B2344803 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
- alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
+ inputFileListPaths = (
+ );
inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
);
- name = "Run Script";
outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
- 331C807D294A63A400263BE5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -342,14 +281,6 @@
};
/* End PBXSourcesBuildPhase section */
-/* Begin PBXTargetDependency section */
- 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 97C146ED1CF9000F007C117D /* Runner */;
- targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
@@ -374,7 +305,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -404,7 +334,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -413,7 +342,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -453,7 +382,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -483,7 +411,6 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -498,7 +425,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -510,7 +437,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -540,7 +466,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -549,7 +474,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -615,45 +540,9 @@
};
name = Release;
};
- B5628A0E2E53D3C1005A9E21 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_OPTIMIZATION_LEVEL = 0;
- PRODUCT_NAME = RunnerTests;
- };
- name = Debug;
- };
- B5628A0F2E53D3C1005A9E21 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- PRODUCT_NAME = RunnerTests;
- };
- name = Release;
- };
- B5628A102E53D3C1005A9E21 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- PRODUCT_NAME = RunnerTests;
- };
- name = Profile;
- };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B5628A0E2E53D3C1005A9E21 /* Debug */,
- B5628A0F2E53D3C1005A9E21 /* Release */,
- B5628A102E53D3C1005A9E21 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index e3773d42e..4003b03e4 100644
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -61,7 +61,6 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
- enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
diff --git a/example/lib/presentation/resources/app_assets.dart b/example/lib/presentation/resources/app_assets.dart
index 08da1e7e4..52b0f75db 100644
--- a/example/lib/presentation/resources/app_assets.dart
+++ b/example/lib/presentation/resources/app_assets.dart
@@ -15,6 +15,8 @@ class AppAssets {
return 'assets/icons/ic_radar_chart.svg';
case ChartType.candlestick:
return 'assets/icons/ic_candle_chart.svg';
+ case ChartType.gauge:
+ return 'assets/icons/ic_gauge_chart.svg';
}
}
diff --git a/example/lib/presentation/resources/app_colors.dart b/example/lib/presentation/resources/app_colors.dart
index a1ca589a1..8303202ac 100644
--- a/example/lib/presentation/resources/app_colors.dart
+++ b/example/lib/presentation/resources/app_colors.dart
@@ -11,9 +11,11 @@ class AppColors {
static const Color mainGridLineColor = Colors.white10;
static const Color borderColor = Colors.white54;
static const Color gridLinesColor = Color(0x11FFFFFF);
+ static const Color grey = Color(0xFFD9D9D9);
static const Color contentColorBlack = Colors.black;
static const Color contentColorWhite = Colors.white;
+ static const Color contentColorWhite12 = Colors.white12;
static const Color contentColorBlue = Color(0xFF2196F3);
static const Color contentColorYellow = Color(0xFFFFC300);
static const Color contentColorOrange = Color(0xFFFF683B);
diff --git a/example/lib/presentation/samples/bar/bar_chart_sample1.dart b/example/lib/presentation/samples/bar/bar_chart_sample1.dart
index e3d736394..de276d715 100644
--- a/example/lib/presentation/samples/bar/bar_chart_sample1.dart
+++ b/example/lib/presentation/samples/bar/bar_chart_sample1.dart
@@ -138,18 +138,17 @@ class BarChartSample1State extends State {
}
List showingGroups() => List.generate(
- 7,
- (i) => switch (i) {
- 0 => makeGroupData(0, 5, isTouched: i == touchedIndex),
- 1 => makeGroupData(1, 6.5, isTouched: i == touchedIndex),
- 2 => makeGroupData(2, 5, isTouched: i == touchedIndex),
- 3 => makeGroupData(3, 7.5, isTouched: i == touchedIndex),
- 4 => makeGroupData(4, 9, isTouched: i == touchedIndex),
- 5 => makeGroupData(5, 11.5, isTouched: i == touchedIndex),
- 6 => makeGroupData(6, 6.5, isTouched: i == touchedIndex),
- _ => throw Error(),
- }
- );
+ 7,
+ (i) => switch (i) {
+ 0 => makeGroupData(0, 5, isTouched: i == touchedIndex),
+ 1 => makeGroupData(1, 6.5, isTouched: i == touchedIndex),
+ 2 => makeGroupData(2, 5, isTouched: i == touchedIndex),
+ 3 => makeGroupData(3, 7.5, isTouched: i == touchedIndex),
+ 4 => makeGroupData(4, 9, isTouched: i == touchedIndex),
+ 5 => makeGroupData(5, 11.5, isTouched: i == touchedIndex),
+ 6 => makeGroupData(6, 6.5, isTouched: i == touchedIndex),
+ _ => throw Error(),
+ });
BarChartData mainBarData() {
return BarChartData(
diff --git a/example/lib/presentation/samples/chart_sample.dart b/example/lib/presentation/samples/chart_sample.dart
index ea1eef1ac..fc05e4087 100644
--- a/example/lib/presentation/samples/chart_sample.dart
+++ b/example/lib/presentation/samples/chart_sample.dart
@@ -46,3 +46,9 @@ class CandlestickChartSample extends ChartSample {
@override
ChartType get type => ChartType.candlestick;
}
+
+class GaugeChartSample extends ChartSample {
+ GaugeChartSample(super.number, super.builder);
+ @override
+ ChartType get type => ChartType.gauge;
+}
diff --git a/example/lib/presentation/samples/chart_samples.dart b/example/lib/presentation/samples/chart_samples.dart
index c848f4bee..1f2d34c84 100644
--- a/example/lib/presentation/samples/chart_samples.dart
+++ b/example/lib/presentation/samples/chart_samples.dart
@@ -1,4 +1,7 @@
import 'package:fl_chart_app/presentation/samples/candlestick/candlestick_chart_sample1.dart';
+import 'package:fl_chart_app/presentation/samples/gauge/gauge_chart_sample1.dart';
+import 'package:fl_chart_app/presentation/samples/gauge/gauge_chart_sample3.dart';
+import 'package:fl_chart_app/presentation/samples/gauge/gauge_chart_sample4.dart';
import 'package:fl_chart_app/util/app_helper.dart';
import 'bar/bar_chart_sample1.dart';
@@ -10,6 +13,7 @@ import 'bar/bar_chart_sample6.dart';
import 'bar/bar_chart_sample7.dart';
import 'bar/bar_chart_sample8.dart';
import 'chart_sample.dart';
+import 'gauge/gauge_chart_sample2.dart';
import 'line/line_chart_sample1.dart';
import 'line/line_chart_sample10.dart';
import 'line/line_chart_sample11.dart';
@@ -73,6 +77,12 @@ class ChartSamples {
],
ChartType.candlestick: [
CandlestickChartSample(1, (context) => const CandlestickChartSample1()),
- ]
+ ],
+ ChartType.gauge: [
+ GaugeChartSample(1, (context) => const GaugeChartSample1()),
+ GaugeChartSample(2, (context) => const GaugeChartSample2()),
+ GaugeChartSample(3, (context) => const GaugeChartSample3()),
+ GaugeChartSample(4, (context) => const GaugeChartSample4()),
+ ],
};
}
diff --git a/example/lib/presentation/samples/gauge/gauge_chart_sample1.dart b/example/lib/presentation/samples/gauge/gauge_chart_sample1.dart
new file mode 100644
index 000000000..99436ca5e
--- /dev/null
+++ b/example/lib/presentation/samples/gauge/gauge_chart_sample1.dart
@@ -0,0 +1,191 @@
+import 'dart:math';
+import 'dart:ui';
+
+import 'package:fl_chart/fl_chart.dart';
+import 'package:fl_chart_app/presentation/resources/app_resources.dart';
+import 'package:flutter/material.dart';
+
+class GaugeChartSample1 extends StatefulWidget {
+ const GaugeChartSample1({super.key});
+
+ @override
+ State createState() => GaugeChartSample1State();
+}
+
+class GaugeChartSample1State extends State {
+ double _value = 0.5;
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.all(28),
+ child: Column(
+ children: [
+ SizedBox(
+ width: 250,
+ height: 250,
+ child: Stack(
+ children: [
+ GaugeChart(
+ GaugeChartData.progress(
+ value: _value,
+ color: AppColors.contentColorPurple,
+ width: 30,
+ backgroundColor:
+ AppColors.contentColorPurple.withValues(alpha: 0.2),
+ startDegreeOffset: -200,
+ sweepAngle: 220,
+ touchData: GaugeTouchData(enabled: true),
+ ticks: GaugeTicks(
+ position: GaugeTickPosition.center,
+ count: 11,
+ offset: 0,
+ painter: _MyCustomGaugeMinMaxTickPainter(
+ color: AppColors.contentColorWhite,
+ radius: 5,
+ minIndex: 2,
+ maxIndex: 8,
+ minMaxLineLength: 40,
+ minMaxLineStrokeWidth: 4,
+ ),
+ checkToShowTick: GaugeTicks.hideEndpoints,
+ ),
+ pointers: [
+ // Needle extending from center toward the current value.
+ GaugePointer(
+ value: _value,
+ painter: GaugePointerNeedlePainter(
+ length: 88,
+ width: 20,
+ tailLength: 40,
+ color: AppColors.contentColorWhite,
+ ),
+ ),
+ // Pivot cap sitting at the gauge center, on top of the
+ // needle's base — just a second pointer with a small
+ // circle painter (anchorRadius: 0).
+ GaugePointer(
+ value: 0.3,
+ painter: GaugePointerCirclePainter(
+ radius: 24,
+ color: AppColors.contentColorBlack,
+ strokeWidth: 2,
+ strokeColor: AppColors.contentColorWhite,
+ ),
+ ),
+ ],
+ ),
+ ),
+ Center(
+ child: Text(
+ "${(_value * 100).toInt()}",
+ style: TextStyle(
+ color: AppColors.contentColorWhite,
+ fontSize: 18,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ )
+ ],
+ ),
+ ),
+ Slider(value: _value, onChanged: (v) => setState(() => _value = v)),
+ ],
+ ),
+ );
+ }
+}
+
+class _MyCustomGaugeMinMaxTickPainter extends GaugeTickCirclePainter {
+ _MyCustomGaugeMinMaxTickPainter({
+ super.color,
+ super.radius,
+ required this.minIndex,
+ required this.maxIndex,
+ required this.minMaxLineLength,
+ required this.minMaxLineStrokeWidth,
+ this.textOffset = 6,
+ this.minTextStyle = const TextStyle(
+ color: Colors.green,
+ fontSize: 12,
+ fontWeight: FontWeight.bold,
+ ),
+ this.maxTextStyle = const TextStyle(
+ color: Colors.red,
+ fontSize: 12,
+ fontWeight: FontWeight.bold,
+ ),
+ }) : super();
+
+ final int minIndex;
+ final int maxIndex;
+ final double minMaxLineLength;
+ final double minMaxLineStrokeWidth;
+ final double textOffset;
+ final TextStyle minTextStyle;
+ final TextStyle maxTextStyle;
+
+ final _paint = Paint();
+
+ @override
+ void draw(Canvas canvas, GaugeTickInfo tickInfo) {
+ super.draw(canvas, tickInfo);
+
+ if (tickInfo.index != minIndex && tickInfo.index != maxIndex) {
+ return;
+ }
+ final isMin = tickInfo.index == minIndex;
+ final text = isMin ? "Min" : "Max";
+ final textStyle = isMin ? minTextStyle : maxTextStyle;
+ final rotation = isMin ? pi : 0.0;
+ final textPainter = TextPainter(
+ text: TextSpan(text: text, style: textStyle),
+ textDirection: TextDirection.ltr,
+ )..layout();
+ // 180 degrees
+ canvas.rotate(rotation);
+ final offsetX = isMin
+ ? 0 + textPainter.width + textOffset
+ : 0 - textPainter.width - minMaxLineLength / 2 - textOffset;
+ textPainter.paint(canvas, Offset(offsetX, 0 - textPainter.height / 2));
+ _paint.color = textStyle.color!;
+ _paint.strokeWidth = minMaxLineStrokeWidth;
+ canvas.drawLine(
+ Offset(0 - minMaxLineLength / 2, 0),
+ Offset(0 + minMaxLineLength / 2, 0),
+ _paint,
+ );
+ }
+
+ @override
+ GaugeTickPainter lerp(GaugeTickPainter b, double t) {
+ if (b is! _MyCustomGaugeMinMaxTickPainter) {
+ return b;
+ }
+ return _MyCustomGaugeMinMaxTickPainter(
+ color: Color.lerp(color, b.color, t)!,
+ radius: lerpDouble(radius, b.radius, t)!,
+ minIndex: minIndex,
+ maxIndex: maxIndex,
+ minMaxLineLength: lerpDouble(minMaxLineLength, b.minMaxLineLength, t)!,
+ minMaxLineStrokeWidth:
+ lerpDouble(minMaxLineStrokeWidth, b.minMaxLineStrokeWidth, t)!,
+ textOffset: lerpDouble(textOffset, b.textOffset, t)!,
+ minTextStyle: TextStyle.lerp(minTextStyle, b.minTextStyle, t)!,
+ maxTextStyle: TextStyle.lerp(maxTextStyle, b.maxTextStyle, t)!,
+ );
+ }
+
+ @override
+ List