1
0
mirror of https://github.com/nisrulz/flutter-examples.git synced 2026-03-22 06:28:48 +00:00

New Example - Calendar (#91)

This commit is contained in:
Ishaan Kesarwani
2022-10-22 23:59:43 +05:30
committed by GitHub
parent d9cc97a7ea
commit 91d4d1b868
100 changed files with 7300 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 28
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.mariamelnik.flutter_date_picker"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mariamelnik.flutter_date_picker">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -0,0 +1,33 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mariamelnik.flutter_date_picker">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="flutter_date_picker"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,13 @@
package com.mariamelnik.flutter_date_picker;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mariamelnik.flutter_date_picker">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@@ -0,0 +1,29 @@
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -0,0 +1,2 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true

View File

@@ -0,0 +1,6 @@
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

View File

@@ -0,0 +1,15 @@
include ':app'
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.0</string>
</dict>
</plist>

View File

@@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@@ -0,0 +1 @@
#include "Generated.xcconfig"

View File

@@ -0,0 +1,491 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
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 */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
CF3B75C9A7D2FA2A4C99F110 /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
97C146F11CF9000F007C117D /* Supporting Files */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
);
path = Runner;
sourceTree = "<group>";
};
97C146F11CF9000F007C117D /* Supporting Files */ = {
isa = PBXGroup;
children = (
97C146F21CF9000F007C117D /* main.m */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0910;
ORGANIZATIONNAME = "The Chromium Authors";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
97C146F31CF9000F007C117D /* main.m in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = S8QB4VV633;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mariamelnik.flutterDatePicker;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mariamelnik.flutterDatePicker;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mariamelnik.flutterDatePicker;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0910"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,6 @@
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : FlutterAppDelegate
@end

View File

@@ -0,0 +1,13 @@
#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end

View File

@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

View File

@@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>flutter_date_picker</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>

View File

@@ -0,0 +1,9 @@
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char* argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

View File

@@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:flutter_material_color_picker/flutter_material_color_picker.dart';
/// Dialog with some Material colors ([materialColors]) to pick one of them.
class ColorPickerDialog extends StatefulWidget {
/// Initially selected color.
///
/// If pre-selected color is not from [materialColors] [Colors.blue] will be
/// used.
final Color selectedColor;
///
const ColorPickerDialog({
Key? key,
required this.selectedColor
}) : super(key: key);
@override
State<StatefulWidget> createState() => _ColorPickerDialogState();
}
class _ColorPickerDialogState extends State<ColorPickerDialog> {
Color _mainColor = Colors.blue;
@override
void initState() {
super.initState();
bool isSelectedMaterial = materialColors.contains(widget.selectedColor);
if (isSelectedMaterial) {
_mainColor = widget.selectedColor;
}
}
@override
// ignore: prefer_expression_function_bodies
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: const EdgeInsets.all(6.0),
title: const Text("Color picker"),
content: MaterialColorPicker(
selectedColor: _mainColor,
allowShades: false,
onMainColorChange: _onMainColorChange,
),
actions: [
TextButton(
child: const Text('CANCEL'),
onPressed: () {
Navigator.of(context).pop(null);
},
),
TextButton(
child: const Text('SUBMIT'),
onPressed: () {
Navigator.of(context).pop(_mainColor);
},
),
],
);
}
void _onMainColorChange (Color? newColor) {
if (newColor == null) return;
setState(() {
_mainColor = newColor;
});
}
}

View File

@@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
// default with and height for the button container
const double _kBtnSize = 24.0;
/// Round colored button with title to select some style color.
class ColorSelectorBtn extends StatelessWidget {
/// Title near color button.
final String title;
/// Color of the button.
final Color color;
/// onTap callback.
final VoidCallback showDialogFunction;
/// Size of the circle.
///
/// By default is [_kBtnSize].
final double colorBtnSize;
///
const ColorSelectorBtn(
{Key? key,
required this.title,
required this.color,
required this.showDialogFunction,
this.colorBtnSize = _kBtnSize})
: super(key: key);
@override
// ignore: prefer_expression_function_bodies
Widget build(BuildContext context) {
return Expanded(
child: Row(
children: <Widget>[
GestureDetector(
onTap: showDialogFunction,
child: Container(
height: colorBtnSize,
width: colorBtnSize,
decoration: BoxDecoration(color: color, shape: BoxShape.circle),
),
),
const SizedBox(
width: 8.0,
),
Expanded(
child: Text(
title,
overflow: TextOverflow.ellipsis,
)),
],
),
);
}
}

View File

@@ -0,0 +1,188 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart' as dp;
import 'package:flutter_date_pickers/flutter_date_pickers.dart';
import '../color_picker_dialog.dart';
import '../color_selector_btn.dart';
import '../event.dart';
/// Page with [dp.DayPicker].
class DayPickerPage extends StatefulWidget {
/// Custom events.
final List<Event> events;
///
const DayPickerPage({
Key? key,
this.events = const []
}) : super(key: key);
@override
State<StatefulWidget> createState() => _DayPickerPageState();
}
class _DayPickerPageState extends State<DayPickerPage> {
DateTime _selectedDate = DateTime.now();
DateTime _firstDate = DateTime.now().subtract(Duration(days: 45));
DateTime _lastDate = DateTime.now().add(Duration(days: 45));
Color selectedDateStyleColor = Colors.blue;
Color selectedSingleDateDecorationColor = Colors.red;
@override
void didChangeDependencies() {
super.didChangeDependencies();
Color? bodyTextColor = Theme.of(context).accentTextTheme.bodyText1?.color;
if (bodyTextColor != null) selectedDateStyleColor = bodyTextColor;
selectedSingleDateDecorationColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
// add selected colors to default settings
dp.DatePickerRangeStyles styles = dp.DatePickerRangeStyles(
selectedDateStyle: Theme.of(context)
.accentTextTheme
.bodyText1
?.copyWith(color: selectedDateStyleColor),
selectedSingleDateDecoration: BoxDecoration(
color: selectedSingleDateDecorationColor,
shape: BoxShape.circle
),
dayHeaderStyle: DayHeaderStyle(
textStyle: TextStyle(
color: Colors.red
)
)
);
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: dp.DayPicker.single(
selectedDate: _selectedDate,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
datePickerLayoutSettings: dp.DatePickerLayoutSettings(
maxDayPickerRowCount: 2,
showPrevMonthEnd: true,
showNextMonthStart: true
),
selectableDayPredicate: _isSelectableCustom,
eventDecorationBuilder: _eventDecorationBuilder,
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ColorSelectorBtn(
title: "Text",
color: selectedDateStyleColor,
showDialogFunction: _showSelectedDateDialog,
colorBtnSize: 42.0,
),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "Background",
color: selectedSingleDateDecorationColor,
showDialogFunction: _showSelectedBackgroundColorDialog,
colorBtnSize: 42.0,
),
],
),
),
Text("Selected: $_selectedDate")
],
),
),
),
],
);
}
// select text color of the selected date
void _showSelectedDateDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedDateStyleColor,
));
if (newSelectedColor != null) {
setState(() {
selectedDateStyleColor = newSelectedColor;
});
}
}
// select background color of the selected date
void _showSelectedBackgroundColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedSingleDateDecorationColor,
));
if (newSelectedColor != null) {
setState(() {
selectedSingleDateDecorationColor = newSelectedColor;
});
}
}
void _onSelectedDateChanged(DateTime newDate) {
setState(() {
_selectedDate = newDate;
});
}
// ignore: prefer_expression_function_bodies
bool _isSelectableCustom (DateTime day) {
return day.weekday < 6;
}
dp.EventDecoration? _eventDecorationBuilder(DateTime date) {
List<DateTime> eventsDates = widget.events
.map<DateTime>((Event e) => e.date)
.toList();
bool isEventDate = eventsDates.any((DateTime d) =>
date.year == d.year
&& date.month == d.month
&& d.day == date.day);
BoxDecoration roundedBorder = BoxDecoration(
border: Border.all(
color: Colors.deepOrange,
),
borderRadius: BorderRadius.all(Radius.circular(3.0))
);
return isEventDate
? dp.EventDecoration(boxDecoration: roundedBorder)
: null;
}
}

View File

@@ -0,0 +1,191 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart' as dp;
import '../color_picker_dialog.dart';
import '../color_selector_btn.dart';
import '../event.dart';
/// Page with [dp.DayPicker] where many single days can be selected.
class DaysPickerPage extends StatefulWidget {
/// Custom events.
final List<Event> events;
///
const DaysPickerPage({
Key? key,
this.events = const []
}) : super(key: key);
@override
State<StatefulWidget> createState() => _DaysPickerPageState();
}
class _DaysPickerPageState extends State<DaysPickerPage> {
List<DateTime> _selectedDates = [];
DateTime _firstDate = DateTime.now().subtract(Duration(days: 45));
DateTime _lastDate = DateTime.now().add(Duration(days: 45));
Color selectedDateStyleColor = Colors.blue;
Color selectedSingleDateDecorationColor = Colors.red;
@override
void initState() {
super.initState();
final now = DateTime.now();
_selectedDates = [
now,
now.subtract(Duration(days: 10)),
now.add(Duration(days: 7))
];
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
Color? bodyTextColor = Theme.of(context).accentTextTheme.bodyText1?.color;
if (bodyTextColor != null) selectedDateStyleColor = bodyTextColor;
selectedSingleDateDecorationColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
// add selected colors to default settings
dp.DatePickerRangeStyles styles = dp.DatePickerRangeStyles(
selectedDateStyle: Theme.of(context)
.accentTextTheme
.bodyText1
?.copyWith(color: selectedDateStyleColor),
selectedSingleDateDecoration: BoxDecoration(
color: selectedSingleDateDecorationColor, shape: BoxShape.circle));
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: dp.DayPicker.multi(
selectedDates: _selectedDates,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
datePickerLayoutSettings: dp.DatePickerLayoutSettings(
maxDayPickerRowCount: 2,
showPrevMonthEnd: true,
showNextMonthStart: true
),
selectableDayPredicate: _isSelectableCustom,
eventDecorationBuilder: _eventDecorationBuilder,
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ColorSelectorBtn(
title: "Text",
color: selectedDateStyleColor,
showDialogFunction: _showSelectedDateDialog,
colorBtnSize: 42.0,
),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "Background",
color: selectedSingleDateDecorationColor,
showDialogFunction: _showSelectedBackgroundColorDialog,
colorBtnSize: 42.0,
),
],
),
),
Text("Selected: $_selectedDates")
],
),
),
),
],
);
}
// select text color of the selected date
void _showSelectedDateDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedDateStyleColor,
));
if (newSelectedColor != null) {
setState(() {
selectedDateStyleColor = newSelectedColor;
});
}
}
// select background color of the selected date
void _showSelectedBackgroundColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedSingleDateDecorationColor,
));
if (newSelectedColor != null) {
setState(() {
selectedSingleDateDecorationColor = newSelectedColor;
});
}
}
void _onSelectedDateChanged(List<DateTime> newDates) {
setState(() {
_selectedDates = newDates;
});
}
// ignore: prefer_expression_function_bodies
bool _isSelectableCustom (DateTime day) {
return day.weekday < 6;
}
dp.EventDecoration? _eventDecorationBuilder(DateTime date) {
List<DateTime> eventsDates = widget.events
.map<DateTime>((Event e) => e.date)
.toList();
bool isEventDate = eventsDates.any((DateTime d) =>
date.year == d.year
&& date.month == d.month
&& d.day == date.day);
BoxDecoration roundedBorder = BoxDecoration(
border: Border.all(
color: Colors.deepOrange,
),
borderRadius: BorderRadius.all(Radius.circular(3.0))
);
return isEventDate
? dp.EventDecoration(boxDecoration: roundedBorder)
: null;
}
}

View File

@@ -0,0 +1,134 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart' as dp;
import '../color_picker_dialog.dart';
import '../color_selector_btn.dart';
/// Page with the [dp.MonthPicker].
class MonthPickerPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _MonthPickerPageState();
}
class _MonthPickerPageState extends State<MonthPickerPage> {
DateTime _firstDate = DateTime.now().subtract(Duration(days: 350));
DateTime _lastDate = DateTime.now().add(Duration(days: 350));
DateTime _selectedDate = DateTime.now();
Color selectedDateStyleColor = Colors.blue;
Color selectedSingleDateDecorationColor = Colors.red;
@override
void didChangeDependencies() {
super.didChangeDependencies();
Color? bodyTextColor = Theme.of(context).accentTextTheme.bodyText1?.color;
if (bodyTextColor != null) selectedDateStyleColor = bodyTextColor;
selectedSingleDateDecorationColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
// add selected colors to default settings
dp.DatePickerStyles styles = dp.DatePickerStyles(
selectedDateStyle: Theme.of(context)
.accentTextTheme
.bodyText1
?.copyWith(color: selectedDateStyleColor),
selectedSingleDateDecoration: BoxDecoration(
color: selectedSingleDateDecorationColor, shape: BoxShape.circle));
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: dp.MonthPicker(
selectedDate: _selectedDate,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ColorSelectorBtn(
title: "Text",
color: selectedDateStyleColor,
showDialogFunction: _showSelectedDateDialog,
colorBtnSize: 42.0,
),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "Background",
color: selectedSingleDateDecorationColor,
showDialogFunction: _showSelectedBackgroundColorDialog,
colorBtnSize: 42.0,
),
],
),
),
Text("Selected: $_selectedDate")
],
),
),
),
],
);
}
// select text color of the selected date
void _showSelectedDateDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedDateStyleColor,
));
if (newSelectedColor != null) {
setState(() {
selectedDateStyleColor = newSelectedColor;
});
}
}
// select background color of the selected date
void _showSelectedBackgroundColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedSingleDateDecorationColor,
));
if (newSelectedColor != null) {
setState(() {
selectedSingleDateDecorationColor = newSelectedColor;
});
}
}
void _onSelectedDateChanged(DateTime newDate) {
setState(() {
_selectedDate = newDate;
});
}
}

View File

@@ -0,0 +1,273 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart';
import '../color_picker_dialog.dart';
import '../color_selector_btn.dart';
import '../event.dart';
/// Page with the [RangePicker].
class RangePickerPage extends StatefulWidget {
/// Custom events.
final List<Event> events;
///
const RangePickerPage({
Key? key,
this.events = const []
}) : super(key: key);
@override
State<StatefulWidget> createState() => _RangePickerPageState();
}
class _RangePickerPageState extends State<RangePickerPage> {
DateTime _firstDate = DateTime.now().subtract(Duration(days: 345));
DateTime _lastDate = DateTime.now().add(Duration(days: 345));
DatePeriod _selectedPeriod = DatePeriod(
DateTime.now().subtract(Duration(days: 30)),
DateTime.now().subtract(Duration(days: 12))
);
Color selectedPeriodStartColor = Colors.blue;
Color selectedPeriodLastColor = Colors.blue;
Color selectedPeriodMiddleColor = Colors.blue;
@override
void didChangeDependencies() {
super.didChangeDependencies();
selectedPeriodLastColor = Theme.of(context).accentColor;
selectedPeriodMiddleColor = Theme.of(context).accentColor;
selectedPeriodStartColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
// add selected colors to default settings
DatePickerRangeStyles styles = DatePickerRangeStyles(
selectedPeriodLastDecoration: BoxDecoration(
color: selectedPeriodLastColor,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(24.0),
bottomRight: Radius.circular(24.0))),
selectedPeriodStartDecoration: BoxDecoration(
color: selectedPeriodStartColor,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(24.0),
bottomLeft: Radius.circular(24.0)
),
),
selectedPeriodMiddleDecoration: BoxDecoration(
color: selectedPeriodMiddleColor, shape: BoxShape.rectangle),
nextIcon: const Icon(Icons.arrow_right),
prevIcon: const Icon(Icons.arrow_left),
dayHeaderStyleBuilder: _dayHeaderStyleBuilder
);
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: RangePicker(
initiallyShowDate: DateTime.now(),
selectedPeriod: _selectedPeriod,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
eventDecorationBuilder: _eventDecorationBuilder,
selectableDayPredicate: _isSelectableCustom,
onSelectionError: _onSelectionError,
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
_stylesBlock(),
_selectedBlock()
],
),
),
),
],
);
}
// Block with show information about selected date
// and boundaries of the selected period.
Widget _selectedBlock() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
_selectedPeriod != null
? Column(children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 4.0),
child: Text("Selected period boundaries:"),
),
Text(_selectedPeriod.start.toString()),
Text(_selectedPeriod.end.toString()),
])
: Container()
],
);
// block with color buttons inside
Widget _stylesBlock() => Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ColorSelectorBtn(
title: "Start",
color: selectedPeriodStartColor,
showDialogFunction: _showSelectedStartColorDialog),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "Middle",
color: selectedPeriodMiddleColor,
showDialogFunction: _showSelectedMiddleColorDialog),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "End",
color: selectedPeriodLastColor,
showDialogFunction: _showSelectedEndColorDialog),
],
),
);
// select background color for the first date of the selected period
void _showSelectedStartColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodStartColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodStartColor = newSelectedColor;
});
}
}
// select background color for the last date of the selected period
void _showSelectedEndColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodLastColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodLastColor = newSelectedColor;
});
}
}
// select background color for the middle dates of the selected period
void _showSelectedMiddleColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodMiddleColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodMiddleColor = newSelectedColor;
});
}
}
void _onSelectedDateChanged(DatePeriod newPeriod) {
setState(() {
_selectedPeriod = newPeriod;
});
}
EventDecoration? _eventDecorationBuilder(DateTime date) {
List<DateTime> eventsDates = widget.events
.map<DateTime>((Event e) => e.date)
.toList();
bool isEventDate = eventsDates.any((DateTime d) =>
date.year == d.year
&& date.month == d.month
&& d.day == date.day);
BoxDecoration roundedBorder = BoxDecoration(
border: Border.all(
color: Colors.green,
),
borderRadius: BorderRadius.all(Radius.circular(3.0))
);
return isEventDate
? EventDecoration(boxDecoration: roundedBorder)
: null;
}
// ignore: prefer_expression_function_bodies
bool _isSelectableCustom (DateTime day) {
DateTime now = DateTime.now();
DateTime yesterday = now.subtract(Duration(days: 1));
DateTime tomorrow = now.add(Duration(days: 1));
bool isYesterday = sameDate(day, yesterday);
bool isTomorrow = sameDate(day, tomorrow);
return !isYesterday && !isTomorrow;
// return true;
// return day.weekday < 6;
// return day.day != DateTime.now().add(Duration(days: 7)).day ;
}
void _onSelectionError(UnselectablePeriodException exception) {
DatePeriod errorPeriod = exception.period;
// If user supposed to set another start of the period.
bool selectStart = _selectedPeriod.start != errorPeriod.start;
DateTime newSelection = selectStart
? errorPeriod.start
: errorPeriod.end;
DatePeriod newPeriod = DatePeriod(newSelection, newSelection);
setState(() {
_selectedPeriod = newPeriod;
});
}
// 0 is Sunday, 6 is Saturday
DayHeaderStyle _dayHeaderStyleBuilder(int weekday) {
bool isWeekend = weekday == 0 || weekday == 6;
return DayHeaderStyle(
textStyle: TextStyle(
color: isWeekend ? Colors.red : Colors.teal
)
);
}
}
bool sameDate(DateTime first, DateTime second) {
return first.year == second.year && first.month == second.month && first.day == second.day;
}

View File

@@ -0,0 +1,228 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart';
import '../event.dart';
/// Page with the [RangePicker] styled according to issue:
/// https://github.com/MariaMelnik/flutter_date_pickers/issues/49
class RangePickerPageStyled extends StatefulWidget {
/// Custom events.
final List<Event> events;
///
const RangePickerPageStyled({
Key? key,
this.events = const []
}) : super(key: key);
@override
State<StatefulWidget> createState() => _RangePickerPageStyledState();
}
class _RangePickerPageStyledState extends State<RangePickerPageStyled> {
DateTime _firstDate = DateTime.now().subtract(Duration(days: 345));
DateTime _lastDate = DateTime.now().add(Duration(days: 345));
DatePeriod _selectedPeriod = DatePeriod(
DateTime.now().subtract(Duration(days: 4)),
DateTime.now().add(Duration(days: 8))
);
Color selectedPeriodStartColor = Colors.blue;
Color selectedPeriodLastColor = Colors.blue;
Color selectedPeriodMiddleColor = Colors.blue;
@override
void initState() {
super.initState();
DateTime selectedPeriodStart = DateTime.now().subtract(Duration(days: 4));
DateTime selectedPeriodEnd = DateTime.now().add(Duration(days: 8));
_selectedPeriod = DatePeriod(selectedPeriodStart, selectedPeriodEnd);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
// defaults for styles
selectedPeriodLastColor = Theme.of(context).accentColor;
selectedPeriodMiddleColor = Theme.of(context).accentColor;
selectedPeriodStartColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
Color middleBgColor = Color.fromRGBO(237, 237, 250, 1);
DecorationImage circleImg = DecorationImage(
image: AssetImage('images/bg.png'),
fit: BoxFit.contain
);
// add selected colors to default settings
DatePickerRangeStyles styles = DatePickerRangeStyles(
selectedPeriodLastDecoration: BoxDecoration(
color: middleBgColor,
gradient: LinearGradient(
colors: [middleBgColor, Colors.transparent],
stops: [0.5, 0.5]
),
image: circleImg,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(24.0),
bottomRight: Radius.circular(24.0))
),
selectedPeriodStartDecoration: BoxDecoration(
color: middleBgColor,
gradient: LinearGradient(
colors: [Colors.transparent, middleBgColor,],
stops: [0.5, 0.5]
),
image: circleImg,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(24.0),
bottomLeft: Radius.circular(24.0)
),
),
selectedPeriodMiddleDecoration: BoxDecoration(
color: middleBgColor,
shape: BoxShape.rectangle
),
);
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: RangePicker(
selectedPeriod: _selectedPeriod,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
eventDecorationBuilder: _eventDecorationBuilder,
selectableDayPredicate: _isSelectableCustom,
onSelectionError: _onSelectionError,
datePickerLayoutSettings: DatePickerLayoutSettings(
showNextMonthStart: true,
showPrevMonthEnd: true
),
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
_selectedBlock()
],
),
),
),
],
);
}
// Block with show information about selected date
// and boundaries of the selected period.
Widget _selectedBlock() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
_selectedPeriod != null
? Column(children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 4.0),
child: Text("Selected period boundaries:"),
),
Text(_selectedPeriod.start.toString()),
Text(_selectedPeriod.end.toString()),
])
: Container()
],
);
void _onSelectedDateChanged(DatePeriod newPeriod) {
setState(() {
_selectedPeriod = newPeriod;
});
}
EventDecoration? _eventDecorationBuilder(DateTime date) {
List<DateTime> eventsDates = widget.events
.map<DateTime>((Event e) => e.date)
.toList();
bool isEventDate = eventsDates.any((DateTime d) =>
date.year == d.year
&& date.month == d.month
&& d.day == date.day);
BoxDecoration roundedBorder = BoxDecoration(
border: Border.all(
color: Colors.green,
),
borderRadius: BorderRadius.all(Radius.circular(3.0))
);
return isEventDate
? EventDecoration(boxDecoration: roundedBorder)
: null;
}
// ignore: prefer_expression_function_bodies
bool _isSelectableCustom (DateTime day) {
DateTime now = DateTime.now();
DateTime yesterday = now.subtract(Duration(days: 1));
DateTime tomorrow = now.add(Duration(days: 1));
bool isYesterday = _sameDate(day, yesterday);
bool isTomorrow = _sameDate(day, tomorrow);
return !isYesterday && !isTomorrow;
// return true;
// return day.weekday < 6;
// return day.day != DateTime.now().add(Duration(days: 7)).day ;
}
void _onSelectionError(UnselectablePeriodException exception) {
DatePeriod errorPeriod = exception.period;
// If user supposed to set another start of the period.
bool selectStart = _selectedPeriod.start != errorPeriod.start;
DateTime newSelection = selectStart
? errorPeriod.start
: errorPeriod.end;
DatePeriod newPeriod = DatePeriod(newSelection, newSelection);
setState(() {
_selectedPeriod = newPeriod;
});
}
// 0 is Sunday, 6 is Saturday
DayHeaderStyle _dayHeaderStyleBuilder(int weekday) {
bool isWeekend = weekday == 0 || weekday == 6;
return DayHeaderStyle(
textStyle: TextStyle(
color: isWeekend ? Colors.red : Colors.teal
)
);
}
}
bool _sameDate(DateTime first, DateTime second) =>
first.year == second.year
&& first.month == second.month
&& first.day == second.day;

View File

@@ -0,0 +1,239 @@
import 'package:flutter/material.dart';
import 'package:flutter_date_pickers/flutter_date_pickers.dart';
import '../color_picker_dialog.dart';
import '../color_selector_btn.dart';
import '../event.dart';
/// Page with the [WeekPicker].
class WeekPickerPage extends StatefulWidget {
/// Custom events.
final List<Event> events;
///
const WeekPickerPage({
Key? key,
this.events = const []
}) : super(key: key);
@override
State<StatefulWidget> createState() => _WeekPickerPageState();
}
class _WeekPickerPageState extends State<WeekPickerPage> {
DateTime _selectedDate = DateTime.now();
DateTime _firstDate = DateTime.now().subtract(Duration(days: 45));
DateTime _lastDate = DateTime.now().add(Duration(days: 45));
DatePeriod? _selectedPeriod;
Color selectedPeriodStartColor = Colors.blue;
Color selectedPeriodLastColor = Colors.blue;
Color selectedPeriodMiddleColor = Colors.blue;
@override
void didChangeDependencies() {
super.didChangeDependencies();
// defaults for styles
selectedPeriodLastColor = Theme.of(context).accentColor;
selectedPeriodMiddleColor = Theme.of(context).accentColor;
selectedPeriodStartColor = Theme.of(context).accentColor;
}
@override
Widget build(BuildContext context) {
// add selected colors to default settings
DatePickerRangeStyles styles = DatePickerRangeStyles(
selectedPeriodLastDecoration: BoxDecoration(
color: selectedPeriodLastColor,
borderRadius: BorderRadius.only(
topRight: Radius.circular(10.0),
bottomRight: Radius.circular(10.0))),
selectedPeriodStartDecoration: BoxDecoration(
color: selectedPeriodStartColor,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.0), bottomLeft: Radius.circular(10.0)),
),
selectedPeriodMiddleDecoration: BoxDecoration(
color: selectedPeriodMiddleColor, shape: BoxShape.rectangle),
);
return Flex(
direction: MediaQuery.of(context).orientation == Orientation.portrait
? Axis.vertical
: Axis.horizontal,
children: <Widget>[
Expanded(
child: WeekPicker(
selectedDate: _selectedDate,
onChanged: _onSelectedDateChanged,
firstDate: _firstDate,
lastDate: _lastDate,
datePickerStyles: styles,
onSelectionError: _onSelectionError,
selectableDayPredicate: _isSelectableCustom,
eventDecorationBuilder: _eventDecorationBuilder,
),
),
Container(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12.0, vertical: 12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"Selected date styles",
style: Theme.of(context).textTheme.subtitle1,
),
_stylesBlock(),
_selectedBlock()
],
),
),
),
],
);
}
// block witt color buttons insede
Widget _stylesBlock() => Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ColorSelectorBtn(
title: "Start",
color: selectedPeriodStartColor,
showDialogFunction: _showSelectedStartColorDialog),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "Middle",
color: selectedPeriodMiddleColor,
showDialogFunction: _showSelectedMiddleColorDialog),
SizedBox(
width: 12.0,
),
ColorSelectorBtn(
title: "End",
color: selectedPeriodLastColor,
showDialogFunction: _showSelectedEndColorDialog),
],
),
);
// Block with information about selected date
// and boundaries of the selected period.
Widget _selectedBlock() => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text("Selected: $_selectedDate"),
),
_selectedPeriod != null
? Column(children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8.0, bottom: 4.0),
child: Text("Selected period boundaries:"),
),
Text(_selectedPeriod!.start.toString()),
Text(_selectedPeriod!.end.toString()),
])
: Container()
],
);
// select background color for the first date of the selected period
void _showSelectedStartColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodStartColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodStartColor = newSelectedColor;
});
}
}
// select background color for the last date of the selected period
void _showSelectedEndColorDialog() async {
Color? newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodLastColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodLastColor = newSelectedColor;
});
}
}
// select background color for the middle dates of the selected period
void _showSelectedMiddleColorDialog() async {
Color newSelectedColor = await showDialog(
context: context,
builder: (_) => ColorPickerDialog(
selectedColor: selectedPeriodMiddleColor,
));
if (newSelectedColor != null) {
setState(() {
selectedPeriodMiddleColor = newSelectedColor;
});
}
}
void _onSelectedDateChanged(DatePeriod newPeriod) {
setState(() {
_selectedDate = newPeriod.start;
_selectedPeriod = newPeriod;
});
}
void _onSelectionError(Object e){
if (e is UnselectablePeriodException) print("catch error: $e");
}
// ignore: prefer_expression_function_bodies
bool _isSelectableCustom (DateTime day) {
// return day.weekday < 6;
return day.day != DateTime.now().add(Duration(days: 7)).day ;
}
EventDecoration? _eventDecorationBuilder(DateTime date) {
List<DateTime> eventsDates = widget.events
.map<DateTime>((Event e) => e.date)
.toList();
bool isEventDate = eventsDates.any((DateTime d) => date.year == d.year
&& date.month == d.month
&& d.day == date.day);
if (!isEventDate) return null;
BoxDecoration roundedBorder = BoxDecoration(
color: Colors.blue,
border: Border.all(
color: Colors.blue,
),
borderRadius: BorderRadius.all(Radius.circular(3.0))
);
TextStyle? whiteText = Theme.of(context)
.textTheme
.bodyText2
?.copyWith(color: Colors.white);
return isEventDate
? EventDecoration(boxDecoration: roundedBorder, textStyle: whiteText)
: null;
}
}

View File

@@ -0,0 +1,14 @@
/// Event for the date pickers.
class Event {
/// Event's date.
final DateTime date;
/// Event's title.
final String dis;
///
Event(this.date, this.dis)
: assert(date != null),
assert(dis != null);
}

View File

@@ -0,0 +1,121 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'date_pickers_widgets/day_picker_page.dart';
import 'date_pickers_widgets/days_picker_page.dart';
import 'date_pickers_widgets/month_picker_page.dart';
import 'date_pickers_widgets/range_picker_page.dart';
import 'date_pickers_widgets/week_picker_page.dart';
import 'event.dart';
void main() {
runApp(MyApp());
}
///
class MyApp extends StatelessWidget {
@override
// ignore: prefer_expression_function_bodies
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: GlobalMaterialLocalizations.delegates,
supportedLocales: [
const Locale('en', 'US'), // American English
const Locale('ru', 'RU'), // Russian
const Locale("pt") // Portuguese
],
debugShowCheckedModeBanner: false,
title: 'Date pickers demo',
theme: ThemeData(
primarySwatch: Colors.blueGrey,
),
home: MyHomePage(
title: 'flutter_date_pickers Demo',
),
);
}
}
/// Start page.
class MyHomePage extends StatefulWidget {
/// Page title.
final String title;
///
MyHomePage({
required this.title,
Key? key,
}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
DateTime startOfPeriod = DateTime.now().subtract(Duration(days: 10));
DateTime endOfPeriod = DateTime.now().add(Duration(days: 10));
int _selectedTab = 0;
final List<Widget> datePickers = <Widget>[
DayPickerPage(events: events,),
DaysPickerPage(),
WeekPickerPage(events: events,),
RangePickerPage(events: events,),
MonthPickerPage()
];
@override
// ignore: prefer_expression_function_bodies
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
widget.title,
style: TextStyle(letterSpacing: 1.15),
),
),
body: datePickers[_selectedTab],
bottomNavigationBar: Theme(
data: Theme.of(context).copyWith(
canvasColor: Colors.blueGrey,
textTheme: Theme.of(context).textTheme.copyWith(
caption: TextStyle(color: Colors.white.withOpacity(0.5)))),
child: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.date_range), label: "Day"),
BottomNavigationBarItem(
icon: Icon(Icons.date_range), label: "Days"),
BottomNavigationBarItem(
icon: Icon(Icons.date_range), label: "Week"),
BottomNavigationBarItem(
icon: Icon(Icons.date_range), label: "Range"),
BottomNavigationBarItem(
icon: Icon(Icons.date_range), label: "Month"),
],
fixedColor: Colors.yellow,
currentIndex: _selectedTab,
onTap: (newIndex) {
setState(() {
_selectedTab = newIndex;
});
},
),
),
);
}
}
/// Mock events.
final List<Event> events = [
Event(DateTime.now(), "Today event"),
Event(DateTime.now().subtract(Duration(days: 3)), "Ev1"),
Event(DateTime.now().subtract(Duration(days: 13)), "Ev2"),
Event(DateTime.now().subtract(Duration(days: 30)), "Ev3"),
Event(DateTime.now().add(Duration(days: 3)), "Ev4"),
Event(DateTime.now().add(Duration(days: 13)), "Ev5"),
Event(DateTime.now().add(Duration(days: 30)), "Ev6"),
];

View File

@@ -0,0 +1,181 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_date_pickers:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "0.2.3+1"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_material_color_picker:
dependency: "direct main"
description:
path: "."
ref: HEAD
resolved-ref: "286596b1e0167877bcdb87011bff77364338ba57"
url: "git://github.com/Bwolfs2/flutter_material_color_picker.git"
source: git
version: "1.0.5-nullsafety.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
intl:
dependency: transitive
description:
name: intl
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
sdks:
dart: ">=2.12.0 <3.0.0"

View File

@@ -0,0 +1,80 @@
name: flutter_date_picker
description: A new Flutter application.
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
flutter_material_color_picker:
# null-safety fork
git:
url: git://github.com/Bwolfs2/flutter_material_color_picker.git
flutter_date_pickers:
path: ../
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- images/bg.png
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.io/assets-and-images/#resolution-aware.
# For details regarding adding assets from package dependencies, see
# https://flutter.io/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.io/custom-fonts/#from-packages