1.集成firebase
2.优化功能
@ -1,5 +1,9 @@
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
// START: FlutterFire Configuration
|
||||
id 'com.google.gms.google-services'
|
||||
id 'com.google.firebase.crashlytics'
|
||||
// END: FlutterFire Configuration
|
||||
id "kotlin-android"
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
@ -27,7 +31,7 @@ def keystoreProperties = new Properties()
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
|
||||
android {
|
||||
namespace "com.now.wallpaper"
|
||||
namespace "com.hello.wallpaper"
|
||||
compileSdk flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
@ -46,7 +50,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.now.wallpaper"
|
||||
applicationId "com.hello.wallpaper"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
// minSdkVersion flutter.minSdkVersion
|
||||
@ -54,6 +58,9 @@ android {
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
|
||||
// Enable MultiDex.
|
||||
multiDexEnabled true
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@ -79,6 +86,15 @@ android {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
|
||||
android.applicationVariants.all { variant ->
|
||||
variant.outputs.all { output ->
|
||||
if (!variant.buildType.isDebuggable()) {
|
||||
// 配置APK输出文件名
|
||||
outputFileName = "hello-wallpaper-${flutterVersionName}-${variant.buildType.name}.apk"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
|
||||
29
android/app/google-services.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"project_info": {
|
||||
"project_number": "318284530945",
|
||||
"project_id": "nowwallpaper",
|
||||
"storage_bucket": "nowwallpaper.appspot.com"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:318284530945:android:c7dd2abf520a9840250700",
|
||||
"android_client_info": {
|
||||
"package_name": "com.hello.wallpaper"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyDP6CpkN3HMpCofXlToug-hadYpTLEgE0E"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"appinvite_service": {
|
||||
"other_platform_oauth_client": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
||||
@ -5,8 +5,7 @@
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="32"
|
||||
tools:ignore="ScopedStorage"
|
||||
/>
|
||||
tools:ignore="ScopedStorage"/>
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="32"
|
||||
@ -18,7 +17,9 @@
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/launcher_icon"
|
||||
android:label="@string/app_name"
|
||||
android:requestLegacyExternalStorage="true">
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:enableOnBackInvokedCallback="true"
|
||||
tools:targetApi="tiramisu">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.now.wallpaper
|
||||
package com.hello.wallpaper
|
||||
|
||||
import io.flutter.Log
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
@ -13,7 +13,7 @@ class MainActivity : FlutterActivity() {
|
||||
} catch (e: Exception) {
|
||||
Log.e(
|
||||
"GeneratedPluginRegistrant",
|
||||
"Error registering plugin set_wallpaper, com.now.wallpaper.SetWallpaperPlugin",
|
||||
"Error registering plugin set_wallpaper, com.hello.wallpaper.SetWallpaperPlugin",
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -1,12 +1,13 @@
|
||||
package com.now.wallpaper
|
||||
package com.hello.wallpaper
|
||||
|
||||
import android.app.WallpaperManager
|
||||
import android.content.Context
|
||||
import android.graphics.BitmapFactory
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import io.flutter.embedding.engine.plugins.FlutterPlugin
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import io.flutter.plugin.common.MethodChannel.Result
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -23,8 +24,9 @@ class SetWallpaperPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
|
||||
channel.setMethodCallHandler(this)
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
override fun onMethodCall(call: MethodCall, result: Result) {
|
||||
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
|
||||
if (call.method == "setWallpaper") {
|
||||
val path = call.argument<String>("path")
|
||||
val wallpaperType = call.argument<Int>("wallpaperType") // 0 for home screen, 1 for lock screen, 2 for both
|
||||
@ -1,6 +1,7 @@
|
||||
<?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:colorBackground" />
|
||||
<!-- <item android:drawable="?android:colorBackground" />-->
|
||||
<item android:drawable="@color/seedColor" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<item>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
<?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" />
|
||||
<!-- <item android:drawable="@android:color/white" />-->
|
||||
<item android:drawable="@color/seedColor" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<item>¬
|
||||
|
||||
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 42 KiB |
12
android/app/src/main/res/values-night-v21/styles.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?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
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
</resources>
|
||||
13
android/app/src/main/res/values-night-v27/styles.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?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
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
</style>
|
||||
</resources>
|
||||
@ -6,9 +6,6 @@
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
|
||||
12
android/app/src/main/res/values-v21/styles.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
</resources>
|
||||
13
android/app/src/main/res/values-v27/styles.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
</style>
|
||||
</resources>
|
||||
4
android/app/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="seedColor">#0A0A14</color>
|
||||
</resources>
|
||||
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Now wallpaper</string>
|
||||
<string name="app_name">Hello Wallpaper</string>
|
||||
</resources>
|
||||
@ -6,9 +6,6 @@
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
storePassword=123456
|
||||
keyPassword=123456
|
||||
keyAlias=now_wallpaper
|
||||
storeFile=../now_wallpaper.jks
|
||||
keyAlias=wallpaper
|
||||
storeFile=../hello_wallpaper.jks
|
||||
|
||||
@ -20,6 +20,10 @@ pluginManagement {
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
// START: FlutterFire Configuration
|
||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||
id "com.google.firebase.crashlytics" version "2.8.1" apply false
|
||||
// END: FlutterFire Configuration
|
||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
||||
}
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 913 KiB After Width: | Height: | Size: 108 KiB |
12207
assets/json/lux_wallpaper.json
Normal file
1
firebase.json
Normal file
@ -0,0 +1 @@
|
||||
{"flutter":{"platforms":{"android":{"default":{"projectId":"nowwallpaper","appId":"1:318284530945:android:c7dd2abf520a9840250700","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"nowwallpaper","appId":"1:318284530945:ios:9ac1774ea498265e250700","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"nowwallpaper","configurations":{"android":"1:318284530945:android:c7dd2abf520a9840250700","ios":"1:318284530945:ios:9ac1774ea498265e250700"}}}}}}
|
||||
@ -15,6 +15,7 @@
|
||||
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 */; };
|
||||
BE2EA703BEDDE99F1866F655 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 874B18522795D289616C343E /* GoogleService-Info.plist */; };
|
||||
D52A56DB3AAE02F2724B4CBE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F7EC70670285B234B265439 /* Pods_RunnerTests.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@ -55,6 +56,7 @@
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
7B71BC8DD4AFE8E93734BDDC /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
874B18522795D289616C343E /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; 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; };
|
||||
@ -137,6 +139,7 @@
|
||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||
0797B7C7F9044CE8DB306198 /* Pods */,
|
||||
58D07E0F3F53151088D726CF /* Frameworks */,
|
||||
874B18522795D289616C343E /* GoogleService-Info.plist */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -199,6 +202,7 @@
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
39CCEDF39CF579238AE308F0 /* [CP] Embed Pods Frameworks */,
|
||||
405E88F0300BCE9602B4DA07 /* [CP] Copy Pods Resources */,
|
||||
41D07400CAF8B16888A62377 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -264,6 +268,7 @@
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
BE2EA703BEDDE99F1866F655 /* GoogleService-Info.plist in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -342,6 +347,24 @@
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
41D07400CAF8B16888A62377 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\n#!/bin/bash\nPATH=${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=$PODS_ROOT/FirebaseCrashlytics/upload-symbols --platform=ios --apple-project-path=${SRCROOT} --env-platform-name=${PLATFORM_NAME} --env-configuration=${CONFIGURATION} --env-project-dir=${PROJECT_DIR} --env-built-products-dir=${BUILT_PRODUCTS_DIR} --env-dwarf-dsym-folder-path=${DWARF_DSYM_FOLDER_PATH} --env-dwarf-dsym-file-name=${DWARF_DSYM_FILE_NAME} --env-infoplist-path=${INFOPLIST_PATH} --default-config=default\n";
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
@ -496,7 +519,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.now.wallpaper;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.hello.wallpaper;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@ -681,7 +704,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.now.wallpaper;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.hello.wallpaper;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
@ -704,7 +727,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.now.wallpaper;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.hello.wallpaper;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 522 KiB |
|
Before Width: | Height: | Size: 911 B After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 522 KiB |
30
ios/Runner/GoogleService-Info.plist
Normal file
@ -0,0 +1,30 @@
|
||||
<?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>API_KEY</key>
|
||||
<string>AIzaSyBAVP2-PNvC07OPHepWpCCb6QzVTRk1cMM</string>
|
||||
<key>GCM_SENDER_ID</key>
|
||||
<string>318284530945</string>
|
||||
<key>PLIST_VERSION</key>
|
||||
<string>1</string>
|
||||
<key>BUNDLE_ID</key>
|
||||
<string>com.hello.wallpaper</string>
|
||||
<key>PROJECT_ID</key>
|
||||
<string>nowwallpaper</string>
|
||||
<key>STORAGE_BUCKET</key>
|
||||
<string>nowwallpaper.appspot.com</string>
|
||||
<key>IS_ADS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_ANALYTICS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_APPINVITE_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_GCM_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_SIGNIN_ENABLED</key>
|
||||
<true></true>
|
||||
<key>GOOGLE_APP_ID</key>
|
||||
<string>1:318284530945:ios:9ac1774ea498265e250700</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -7,7 +7,7 @@
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Now wallpaper</string>
|
||||
<string>Hello Wallpaper</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
@ -6,8 +6,8 @@ import 'dart:async';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:applovin_max/applovin_max.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:now_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:hello_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:hello_wallpaper/firebase/analytics_util.dart';
|
||||
|
||||
class ApplovinManage {
|
||||
ApplovinManage._();
|
||||
@ -20,9 +20,9 @@ class ApplovinManage {
|
||||
final String applovinKey = 'nEo4OHOhAZuAK9-IARuNaUfW-yDLBayq9FIGZs0L9XMNTByuDV6dsvMEIGnEAkQu-KR8D42QdKRlbniP910xnK';
|
||||
|
||||
/// 广告单元Id
|
||||
final String adUnitId1 = 'edc4bd530e79af75';
|
||||
final String adUnitId2 = '3f38d70ff5e85f92';
|
||||
final String adUnitId3 = '8a0fc2feeba310bc';
|
||||
final String adUnitId1 = 'a2ced77c3755055b';
|
||||
final String adUnitId2 = 'a3819ba97232d772';
|
||||
final String adUnitId3 = 'bb0bfc77dcfd1fc4';
|
||||
|
||||
/// 是否已初始化
|
||||
bool isInitialized = false;
|
||||
@ -47,17 +47,16 @@ class ApplovinManage {
|
||||
}
|
||||
|
||||
/// 初始化插页广告
|
||||
void initializeInterstitialAds({VoidCallback? onAdLoadedCallback}) {
|
||||
void initializeInterstitialAds({required Function() onGoHomeTap}) {
|
||||
if (isInitialized) {
|
||||
AppLovinMAX.setInterstitialListener(InterstitialListener(
|
||||
onAdLoadedCallback: (ad) {
|
||||
onAdLoadedCallback: (ad) async {
|
||||
LogPrint.d('插页广告加载成功:${ad.adUnitId}');
|
||||
if (ad.adUnitId == adUnitId1 && isSplashScreen) {
|
||||
isSplashScreen = false;
|
||||
onAdLoadedCallback!;
|
||||
showAdIfReady(adUnitId1);
|
||||
// AppLovinMAX.showInterstitial(adUnitId1);
|
||||
await showAdIfReady(adUnitId1);
|
||||
AppLovinMAX.loadInterstitial(adUnitId1);
|
||||
isSplashScreen = false;
|
||||
onGoHomeTap();
|
||||
}
|
||||
_interstitialRetryAttempt = 0;
|
||||
},
|
||||
@ -65,8 +64,9 @@ class ApplovinManage {
|
||||
LogPrint.d('插页广告加载失败adUnitId:$adUnitId,code:${error.code},message:${error.message}');
|
||||
if (adUnitId == adUnitId1 && isSplashScreen) {
|
||||
isSplashScreen = false;
|
||||
onGoHomeTap();
|
||||
}
|
||||
// Applovin recommends that you retry with exponentially higher delays up to a maximum delay (in this case 64 seconds).
|
||||
// Applovin建议您以指数级更高的延迟重试,最大延迟可达64秒
|
||||
_interstitialRetryAttempt = _interstitialRetryAttempt + 1;
|
||||
if (_interstitialRetryAttempt > _maxExponentialRetryCount) return;
|
||||
int retryDelay = pow(2, min(_maxExponentialRetryCount, _interstitialRetryAttempt)).toInt();
|
||||
@ -78,9 +78,13 @@ class ApplovinManage {
|
||||
onAdDisplayedCallback: (ad) {
|
||||
LogPrint.d('插页广告显示成功:${ad.adUnitId}');
|
||||
// _startTimer();
|
||||
// 打点
|
||||
AnalyticsUtil.logAdImpression(ad.adUnitId, ad.networkName, 1, 1, 0);
|
||||
},
|
||||
onAdDisplayFailedCallback: (ad, error) {
|
||||
LogPrint.d('插页广告显示失败adUnitId:${ad.adUnitId},code:${error.code},message:${error.message}');
|
||||
// 打点
|
||||
AnalyticsUtil.logAdImpression(ad.adUnitId, ad.networkName, 1, 0, 1);
|
||||
},
|
||||
onAdClickedCallback: (ad) {},
|
||||
onAdHiddenCallback: (ad) {
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:now_wallpaper/res/themes/app_styles.dart';
|
||||
import 'package:hello_wallpaper/res/themes/app_styles.dart';
|
||||
|
||||
class BaseTextButton extends StatelessWidget {
|
||||
final double? width;
|
||||
|
||||
@ -5,8 +5,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:now_wallpaper/common/components/divider_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:hello_wallpaper/common/components/divider_widget.dart';
|
||||
|
||||
class BottomSheetDialog {
|
||||
static void show(void Function(int location) function) {
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/common/utils/obj_util.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/utils/obj_util.dart';
|
||||
|
||||
class ProcessDialog extends StatelessWidget {
|
||||
final double process;
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/divider_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/divider_widget.dart';
|
||||
|
||||
class RemindDialog extends StatelessWidget {
|
||||
const RemindDialog({
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
|
||||
class ImageNetworkWidget extends StatelessWidget {
|
||||
const ImageNetworkWidget({
|
||||
|
||||
@ -5,9 +5,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/res/themes/app_colors.dart';
|
||||
import 'package:hello_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/res/themes/app_colors.dart';
|
||||
|
||||
class BaseAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
const BaseAppBar(
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/res/themes/app_sizes.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/res/themes/app_sizes.dart';
|
||||
|
||||
class TitleBarWidget extends StatelessWidget {
|
||||
const TitleBarWidget(
|
||||
|
||||
@ -6,7 +6,7 @@ import 'dart:async';
|
||||
import 'package:easy_refresh/easy_refresh.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
|
||||
class BaseEasyRefresh extends StatelessWidget {
|
||||
const BaseEasyRefresh({
|
||||
|
||||
@ -4,12 +4,12 @@
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
|
||||
import 'package:now_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:now_wallpaper/common/network/base_error.dart';
|
||||
import 'package:now_wallpaper/common/network/dio_interceptor.dart';
|
||||
import 'package:now_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:now_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:now_wallpaper/models/base_resp_model.dart';
|
||||
import 'package:hello_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:hello_wallpaper/common/network/base_error.dart';
|
||||
import 'package:hello_wallpaper/common/network/dio_interceptor.dart';
|
||||
import 'package:hello_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:hello_wallpaper/models/base_resp_model.dart';
|
||||
|
||||
class DioClient {
|
||||
static final DioClient _instance = DioClient._internal();
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:now_wallpaper/models/base_resp_model.dart';
|
||||
import 'package:hello_wallpaper/models/base_resp_model.dart';
|
||||
|
||||
class DioInterceptor extends Interceptor {
|
||||
@override
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
// Description: 设置壁纸插件
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:now_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:hello_wallpaper/common/utils/log_print.dart';
|
||||
|
||||
class SetWallpaper {
|
||||
static const MethodChannel _channel = MethodChannel('set_wallpaper');
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
// Date: 2024/5/8
|
||||
// Description: 收藏数据
|
||||
|
||||
import 'package:now_wallpaper/common/storage/hive_storage.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/common/storage/hive_storage.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
|
||||
class FavoriteData {
|
||||
/// 私有构造函数
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
// Description: 持久化储存
|
||||
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
|
||||
const favoriteBox = 'favoriteBox';
|
||||
|
||||
|
||||
@ -7,12 +7,12 @@ import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/common/network/dio_client.dart';
|
||||
import 'package:now_wallpaper/common/utils/filesize_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:now_wallpaper/common/utils/num_util.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/network/dio_client.dart';
|
||||
import 'package:hello_wallpaper/common/utils/filesize_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/log_print.dart';
|
||||
import 'package:hello_wallpaper/common/utils/num_util.dart';
|
||||
|
||||
class DownloadUtil {
|
||||
/// 下载文件
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:now_wallpaper/common/components/dialog/remind_dialog.dart';
|
||||
import 'package:hello_wallpaper/common/components/dialog/remind_dialog.dart';
|
||||
|
||||
class PermissionUtil {
|
||||
/// 检测是否有权限
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
// Date: 2024/5/11
|
||||
// Description: 设置锁屏/首页壁纸
|
||||
|
||||
import 'package:now_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:now_wallpaper/common/plugin/set_wallpaper.dart';
|
||||
import 'package:hello_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:hello_wallpaper/common/plugin/set_wallpaper.dart';
|
||||
|
||||
class WallpaperManage {
|
||||
static Future setWallpaper(String imgPath, int location) async {
|
||||
|
||||
29
lib/firebase/analytics_util.dart
Normal file
@ -0,0 +1,29 @@
|
||||
// Author: fengshengxiong
|
||||
// Date: 2024/5/22
|
||||
// Description: firebase analytics工具类
|
||||
|
||||
import 'package:firebase_analytics/firebase_analytics.dart';
|
||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
class AnalyticsUtil {
|
||||
/// 初始化FlutterFire
|
||||
static Future<void> initializeFlutterFire() async {
|
||||
// 仅在非调试版本中启用它
|
||||
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(!kDebugMode);
|
||||
}
|
||||
|
||||
/// 广告日志记录
|
||||
static logAdImpression(String adId, String adName, int shouldCount, int successCount, int failCount) {
|
||||
FirebaseAnalytics.instance.logEvent(
|
||||
name: 'ad_impression',
|
||||
parameters: {
|
||||
'adId': adId,
|
||||
'adName': adName,
|
||||
'shouldCount': shouldCount,
|
||||
'successCount': successCount,
|
||||
'failCount': failCount,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
69
lib/firebase_options.dart
Normal file
@ -0,0 +1,69 @@
|
||||
// File generated by FlutterFire CLI.
|
||||
// ignore_for_file: type=lint
|
||||
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
||||
import 'package:flutter/foundation.dart'
|
||||
show defaultTargetPlatform, kIsWeb, TargetPlatform;
|
||||
|
||||
/// Default [FirebaseOptions] for use with your Firebase apps.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// import 'firebase_options.dart';
|
||||
/// // ...
|
||||
/// await Firebase.initializeApp(
|
||||
/// options: DefaultFirebaseOptions.currentPlatform,
|
||||
/// );
|
||||
/// ```
|
||||
class DefaultFirebaseOptions {
|
||||
static FirebaseOptions get currentPlatform {
|
||||
if (kIsWeb) {
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for web - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
}
|
||||
switch (defaultTargetPlatform) {
|
||||
case TargetPlatform.android:
|
||||
return android;
|
||||
case TargetPlatform.iOS:
|
||||
return ios;
|
||||
case TargetPlatform.macOS:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for macos - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
case TargetPlatform.windows:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for windows - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
case TargetPlatform.linux:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for linux - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
default:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions are not supported for this platform.',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static const FirebaseOptions android = FirebaseOptions(
|
||||
apiKey: 'AIzaSyDP6CpkN3HMpCofXlToug-hadYpTLEgE0E',
|
||||
appId: '1:318284530945:android:c7dd2abf520a9840250700',
|
||||
messagingSenderId: '318284530945',
|
||||
projectId: 'nowwallpaper',
|
||||
storageBucket: 'nowwallpaper.appspot.com',
|
||||
);
|
||||
|
||||
static const FirebaseOptions ios = FirebaseOptions(
|
||||
apiKey: 'AIzaSyBAVP2-PNvC07OPHepWpCCb6QzVTRk1cMM',
|
||||
appId: '1:318284530945:ios:9ac1774ea498265e250700',
|
||||
messagingSenderId: '318284530945',
|
||||
projectId: 'nowwallpaper',
|
||||
storageBucket: 'nowwallpaper.appspot.com',
|
||||
iosBundleId: 'com.hello.wallpaper',
|
||||
);
|
||||
|
||||
}
|
||||
@ -18,6 +18,6 @@ class Assets {
|
||||
static const String imagesIcSettings = 'assets/images/ic_settings.png';
|
||||
static const String imagesImgError = 'assets/images/img_error.png';
|
||||
static const String imagesImgPlaceholder = 'assets/images/img_placeholder.png';
|
||||
static const String jsonWallpaper = 'assets/json/wallpaper.json';
|
||||
static const String jsonLuxWallpaper = 'assets/json/lux_wallpaper.json';
|
||||
|
||||
}
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
// This file is automatically generated. DO NOT EDIT, all your changes would be lost.
|
||||
import 'package:flutter/material.dart' show debugPrint;
|
||||
import 'package:now_wallpaper/models/base_resp_model.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/models/base_resp_model.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
|
||||
JsonConvert jsonConvert = JsonConvert();
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import 'package:now_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:now_wallpaper/models/base_resp_model.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:hello_wallpaper/models/base_resp_model.dart';
|
||||
|
||||
BaseRespModel $BaseRespModelFromJson(Map<String, dynamic> json) {
|
||||
final BaseRespModel baseRespModel = BaseRespModel();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import 'package:now_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base/json_convert_content.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
|
||||
WallpaperModel $WallpaperModelFromJson(Map<String, dynamic> json) {
|
||||
final WallpaperModel wallpaperModel = WallpaperModel();
|
||||
|
||||
@ -1,16 +1,20 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:now_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:now_wallpaper/common/storage/hive_storage.dart';
|
||||
import 'package:now_wallpaper/res/themes/app_themes.dart';
|
||||
import 'package:now_wallpaper/res/values/strings.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:hello_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:hello_wallpaper/common/storage/hive_storage.dart';
|
||||
import 'package:hello_wallpaper/firebase_options.dart';
|
||||
import 'package:hello_wallpaper/res/themes/app_themes.dart';
|
||||
import 'package:hello_wallpaper/res/values/strings.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
@ -21,8 +25,23 @@ void main() async {
|
||||
DeviceOrientation.portraitDown,
|
||||
]);
|
||||
|
||||
// 初始化Firebase
|
||||
await Firebase.initializeApp(
|
||||
options: DefaultFirebaseOptions.currentPlatform,
|
||||
);
|
||||
|
||||
// 非异步错误
|
||||
FlutterError.onError = (errorDetails) {
|
||||
FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
|
||||
};
|
||||
// 异步错误
|
||||
PlatformDispatcher.instance.onError = (error, stack) {
|
||||
FirebaseCrashlytics.instance.recordError(error, stack, fatal: false);
|
||||
return true;
|
||||
};
|
||||
|
||||
// 初始化广告sdk
|
||||
await ApplovinManage().initApplovin();
|
||||
// await ApplovinManage().initApplovin();
|
||||
|
||||
// 初始化Hive
|
||||
await initHive();
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:now_wallpaper/generated/json/base/json_field.dart';
|
||||
import 'package:now_wallpaper/generated/json/base_resp_model.g.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base/json_field.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base_resp_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class BaseRespModel {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:now_wallpaper/generated/json/base/json_field.dart';
|
||||
import 'package:now_wallpaper/generated/json/wallpaper_model.g.dart';
|
||||
import 'package:hello_wallpaper/generated/json/base/json_field.dart';
|
||||
import 'package:hello_wallpaper/generated/json/wallpaper_model.g.dart';
|
||||
|
||||
part 'wallpaper_model.g.dart';
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:now_wallpaper/res/values/strings.dart';
|
||||
import 'package:hello_wallpaper/res/values/strings.dart';
|
||||
|
||||
class AboutController extends GetxController {
|
||||
var versionName = ''.obs;
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/modules/about/about_controller.dart';
|
||||
import 'package:now_wallpaper/res/values/strings.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/modules/about/about_controller.dart';
|
||||
import 'package:hello_wallpaper/res/values/strings.dart';
|
||||
|
||||
class AboutView extends GetView<AboutController> {
|
||||
const AboutView({super.key});
|
||||
|
||||
@ -1,22 +1,32 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class CatalogController extends GetxController {
|
||||
static CatalogController get to => Get.find<CatalogController>();
|
||||
late ScrollController scrollController;
|
||||
late ViewState viewState;
|
||||
late List<WallpaperModel> wallpaperModelList;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
scrollController = ScrollController();
|
||||
getData();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
scrollController.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void getData() {
|
||||
wallpaperModelList = HomeController.to.wallpaperModelList;
|
||||
wallpaperModelList.shuffle();
|
||||
viewState = wallpaperModelList.isNotEmpty ? ViewState.normal : ViewState.empty;
|
||||
refresh();
|
||||
}
|
||||
|
||||
@ -1,34 +1,42 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/catalog/catalog_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/catalog/catalog_controller.dart';
|
||||
|
||||
class CatalogView extends GetView<CatalogController> {
|
||||
const CatalogView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Get.lazyPut(() => CatalogController());
|
||||
Get.put(CatalogController());
|
||||
return GetBuilder<CatalogController>(
|
||||
builder: (logic) {
|
||||
return ListView.separated(
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 7.h),
|
||||
itemCount: controller.wallpaperModelList.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildCatalogItem(controller.wallpaperModelList[index]);
|
||||
},
|
||||
separatorBuilder: (context, index) {
|
||||
return SizedBox(height: 24.h);
|
||||
},
|
||||
return MediaQuery.removePadding(
|
||||
context: context,
|
||||
removeTop: true,
|
||||
child: Scrollbar(
|
||||
controller: controller.scrollController,
|
||||
child: ListView.separated(
|
||||
controller: controller.scrollController,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20).w,
|
||||
itemCount: controller.wallpaperModelList.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildCatalogItem(controller.wallpaperModelList[index], index);
|
||||
},
|
||||
separatorBuilder: (context, index) {
|
||||
return SizedBox(height: 24.h);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildCatalogItem(WallpaperModel item) {
|
||||
Widget _buildCatalogItem(WallpaperModel item, int index) {
|
||||
final wallpaperList = controller.getRandomFiveList(item);
|
||||
return Column(
|
||||
children: [
|
||||
@ -79,8 +87,8 @@ class CatalogView extends GetView<CatalogController> {
|
||||
},
|
||||
blendMode: BlendMode.dstIn,
|
||||
child: ListView.separated(
|
||||
scrollDirection: Axis.horizontal,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: wallpaperList.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildWallpaperItem(wallpaperList, wallpaperList[index], index);
|
||||
@ -98,11 +106,14 @@ class CatalogView extends GetView<CatalogController> {
|
||||
Widget _buildWallpaperItem(List<WallpaperData> wallpaperList, WallpaperData item, int index) {
|
||||
return GestureDetector(
|
||||
onTap: () => controller.onTapItem(wallpaperList, index),
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
width: 136.w,
|
||||
height: double.infinity,
|
||||
radius: 8.r,
|
||||
child: Hero(
|
||||
tag: '$index-${item.original}',
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
width: 136.w,
|
||||
height: double.infinity,
|
||||
radius: 8.r,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/modules/cls_det/cls_det_controller.dart';
|
||||
import 'package:hello_wallpaper/modules/cls_det/cls_det_controller.dart';
|
||||
|
||||
class ClsDetBinding extends Bindings {
|
||||
@override
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class ClsDetController extends GetxController {
|
||||
late final List<WallpaperData> wallpaperDataList;
|
||||
|
||||
@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/cls_det/cls_det_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/cls_det/cls_det_controller.dart';
|
||||
|
||||
class ClsDetView extends GetView<ClsDetController> {
|
||||
const ClsDetView({super.key});
|
||||
@ -14,16 +14,18 @@ class ClsDetView extends GetView<ClsDetController> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: BaseAppBar(controller.clsName),
|
||||
body: MasonryGridView.count(
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 10.w,
|
||||
crossAxisSpacing: 10.w,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 7.h),
|
||||
itemCount: controller.wallpaperDataList.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildDiscoverItem(controller.wallpaperDataList[index], index);
|
||||
},
|
||||
body: Scrollbar(
|
||||
child: MasonryGridView.count(
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 10.w,
|
||||
crossAxisSpacing: 10.w,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20).w,
|
||||
itemCount: controller.wallpaperDataList.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildDiscoverItem(controller.wallpaperDataList[index], index);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -31,9 +33,12 @@ class ClsDetView extends GetView<ClsDetController> {
|
||||
Widget _buildDiscoverItem(WallpaperData item, index) {
|
||||
return GestureDetector(
|
||||
onTap: () => controller.onTapItem(index),
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
child: Hero(
|
||||
tag: '$index-${item.original}',
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import 'package:easy_refresh/easy_refresh.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/common/utils/obj_util.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/utils/obj_util.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class DiscoverController extends GetxController {
|
||||
static DiscoverController get to => Get.find<DiscoverController>();
|
||||
@ -37,6 +37,8 @@ class DiscoverController extends GetxController {
|
||||
}
|
||||
viewState = HomeController.to.viewState;
|
||||
allWallpaper = HomeController.to.wallpaperModelList.expand((element) => element.data ?? <WallpaperData>[]).toList();
|
||||
// 打乱List顺序
|
||||
allWallpaper.shuffle();
|
||||
_getDataToShow();
|
||||
}
|
||||
|
||||
|
||||
@ -2,18 +2,18 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:now_wallpaper/common/components/refresh/base_easyrefresh.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/discover/discover_controller.dart';
|
||||
import 'package:now_wallpaper/res/themes/app_sizes.dart';
|
||||
import 'package:hello_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/refresh/base_easyrefresh.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/discover/discover_controller.dart';
|
||||
import 'package:hello_wallpaper/res/themes/app_sizes.dart';
|
||||
|
||||
class DiscoverView extends GetView<DiscoverController> {
|
||||
const DiscoverView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Get.lazyPut(() => DiscoverController());
|
||||
Get.put(DiscoverController());
|
||||
return GetBuilder<DiscoverController>(
|
||||
builder: (controller) {
|
||||
return Column(
|
||||
@ -24,20 +24,26 @@ class DiscoverView extends GetView<DiscoverController> {
|
||||
SizedBox(height: 7.h),
|
||||
],
|
||||
Expanded(
|
||||
child: BaseEasyRefresh(
|
||||
controller: controller.refreshController,
|
||||
onLoad: controller.onLoad,
|
||||
viewState: controller.viewState,
|
||||
height: discoverListHeight,
|
||||
child: MasonryGridView.count(
|
||||
itemCount: controller.wallpaperDataList.length,
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 10.w,
|
||||
crossAxisSpacing: 10.w,
|
||||
padding: EdgeInsets.fromLTRB(20.w, 0, 20.w, 7.h),
|
||||
itemBuilder: (context, index) {
|
||||
return _buildDiscoverItem(controller.wallpaperDataList[index], index);
|
||||
},
|
||||
child: MediaQuery.removePadding(
|
||||
context: context,
|
||||
removeTop: true,
|
||||
child: Scrollbar(
|
||||
child: BaseEasyRefresh(
|
||||
controller: controller.refreshController,
|
||||
onLoad: controller.onLoad,
|
||||
viewState: controller.viewState,
|
||||
height: discoverListHeight,
|
||||
child: MasonryGridView.count(
|
||||
itemCount: controller.wallpaperDataList.length,
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 10.w,
|
||||
crossAxisSpacing: 10.w,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20).w,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildDiscoverItem(controller.wallpaperDataList[index], index);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -50,9 +56,12 @@ class DiscoverView extends GetView<DiscoverController> {
|
||||
Widget _buildDiscoverItem(WallpaperData item, index) {
|
||||
return GestureDetector(
|
||||
onTap: () => controller.onTapItem(index),
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
child: Hero(
|
||||
tag: '$index-${item.original}',
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,13 +1,15 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/dialog/remind_dialog.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/common/storage/favorite_data.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/common/components/dialog/remind_dialog.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/storage/favorite_data.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class FavoriteController extends GetxController {
|
||||
static FavoriteController get to => Get.find<FavoriteController>();
|
||||
late ScrollController scrollController;
|
||||
late ViewState viewState;
|
||||
late List<WallpaperData> favoriteList;
|
||||
var todayHottestList = <WallpaperData>[];
|
||||
@ -16,10 +18,17 @@ class FavoriteController extends GetxController {
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
scrollController = ScrollController();
|
||||
getData();
|
||||
getTodayHottestList();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
scrollController.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void getData() {
|
||||
favoriteList = FavoriteData().getWallpaperData().reversed.toList();
|
||||
_refreshList();
|
||||
|
||||
@ -2,18 +2,18 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:now_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:hello_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
|
||||
class FavoriteView extends GetView<FavoriteController> {
|
||||
const FavoriteView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Get.lazyPut(() => FavoriteController());
|
||||
Get.put(FavoriteController());
|
||||
return GetBuilder<FavoriteController>(
|
||||
builder: (logic) {
|
||||
return Column(
|
||||
@ -21,16 +21,24 @@ class FavoriteView extends GetView<FavoriteController> {
|
||||
Expanded(
|
||||
child: ViewStateWidget(
|
||||
viewState: controller.viewState,
|
||||
child: MasonryGridView.count(
|
||||
itemCount: controller.favoriteList.length,
|
||||
crossAxisCount: 3,
|
||||
mainAxisSpacing: 7.w,
|
||||
crossAxisSpacing: 7.w,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 7.h),
|
||||
itemBuilder: (context, index) {
|
||||
return _buildFavoriteItem(controller.favoriteList[index], index);
|
||||
},
|
||||
child: MediaQuery.removePadding(
|
||||
context: context,
|
||||
removeTop: true,
|
||||
child: Scrollbar(
|
||||
controller: controller.scrollController,
|
||||
child: MasonryGridView.count(
|
||||
controller: controller.scrollController,
|
||||
itemCount: controller.favoriteList.length,
|
||||
crossAxisCount: 3,
|
||||
mainAxisSpacing: 7.w,
|
||||
crossAxisSpacing: 7.w,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20).w,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildFavoriteItem(controller.favoriteList[index], index);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -47,9 +55,12 @@ class FavoriteView extends GetView<FavoriteController> {
|
||||
return GestureDetector(
|
||||
onTap: () => controller.onTapItem(index, true),
|
||||
onLongPress: () => controller.onLongPress(index),
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
child: Hero(
|
||||
tag: '$index-${item.original}',
|
||||
child: ImageNetworkWidget(
|
||||
url: item.previewThumb,
|
||||
radius: 8.r,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -76,10 +87,13 @@ class FavoriteView extends GetView<FavoriteController> {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 3.5).w,
|
||||
child: GestureDetector(
|
||||
onTap: () => controller.onTapItem(e.key, false),
|
||||
child: ImageNetworkWidget(
|
||||
url: e.value.previewThumb,
|
||||
height: 183.h,
|
||||
radius: 8.r,
|
||||
child: Hero(
|
||||
tag: '${e.key}-${e.value.original}',
|
||||
child: ImageNetworkWidget(
|
||||
url: e.value.previewThumb,
|
||||
height: 183.h,
|
||||
radius: 8.r,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:hello_wallpaper/modules/home/home_controller.dart';
|
||||
|
||||
class HomeBinding extends Bindings {
|
||||
@override
|
||||
|
||||
@ -4,17 +4,18 @@ import 'dart:math';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/catalog/catalog_controller.dart';
|
||||
import 'package:now_wallpaper/modules/catalog/catalog_view.dart';
|
||||
import 'package:now_wallpaper/modules/discover/discover_controller.dart';
|
||||
import 'package:now_wallpaper/modules/discover/discover_view.dart';
|
||||
import 'package:now_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
import 'package:now_wallpaper/modules/favorite/favorite_view.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/firebase/analytics_util.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/catalog/catalog_controller.dart';
|
||||
import 'package:hello_wallpaper/modules/catalog/catalog_view.dart';
|
||||
import 'package:hello_wallpaper/modules/discover/discover_controller.dart';
|
||||
import 'package:hello_wallpaper/modules/discover/discover_view.dart';
|
||||
import 'package:hello_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
import 'package:hello_wallpaper/modules/favorite/favorite_view.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class HomeController extends GetxController with WidgetsBindingObserver {
|
||||
static HomeController get to => Get.find<HomeController>();
|
||||
@ -33,6 +34,7 @@ class HomeController extends GetxController with WidgetsBindingObserver {
|
||||
super.onInit();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
pageController = PageController(initialPage: currentIndex.value);
|
||||
AnalyticsUtil.initializeFlutterFire();
|
||||
}
|
||||
|
||||
@override
|
||||
@ -98,7 +100,7 @@ class HomeController extends GetxController with WidgetsBindingObserver {
|
||||
/// 获取所有数据
|
||||
Future<void> _getAllData() async {
|
||||
// 读取json文件,获取数据
|
||||
var data = jsonDecode(await rootBundle.loadString(Assets.jsonWallpaper));
|
||||
var data = jsonDecode(await rootBundle.loadString(Assets.jsonLuxWallpaper));
|
||||
if (data != null && data is List) {
|
||||
wallpaperModelList = data.map((e) => WallpaperModel.fromJson(e)).toList();
|
||||
viewState = wallpaperModelList.isNotEmpty ? ViewState.normal : ViewState.empty;
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/keep_alive_wrapper.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/title_bar_widget.dart';
|
||||
import 'package:now_wallpaper/modules/home/home_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/keep_alive_wrapper.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/title_bar_widget.dart';
|
||||
import 'package:hello_wallpaper/modules/home/home_controller.dart';
|
||||
|
||||
class HomeView extends GetView<HomeController> {
|
||||
const HomeView({super.key});
|
||||
@ -11,25 +11,24 @@ class HomeView extends GetView<HomeController> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
Obx(() {
|
||||
return TitleBarWidget(
|
||||
controller.pages[controller.currentIndex.value].label,
|
||||
settingsOnTap: controller.onTapSettings,
|
||||
);
|
||||
}),
|
||||
Expanded(
|
||||
child: PageView(
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
controller: controller.pageController,
|
||||
onPageChanged: (index) => controller.onPageChanged(index),
|
||||
children: controller.pages.map((e) => KeepAliveWrapper(child: e.widget)).toList(),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
SizedBox(height: ScreenUtil().statusBarHeight),
|
||||
Obx(() {
|
||||
return TitleBarWidget(
|
||||
controller.pages[controller.currentIndex.value].label,
|
||||
settingsOnTap: controller.onTapSettings,
|
||||
);
|
||||
}),
|
||||
Expanded(
|
||||
child: PageView(
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
controller: controller.pageController,
|
||||
onPageChanged: (index) => controller.onPageChanged(index),
|
||||
children: controller.pages.map((e) => KeepAliveWrapper(child: e.widget)).toList(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
bottomNavigationBar: Obx(() {
|
||||
return BottomNavigationBar(
|
||||
|
||||
@ -2,10 +2,10 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/res/values/strings.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/res/values/strings.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
class SettingsController extends GetxController {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/modules/settings/settings_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/modules/settings/settings_controller.dart';
|
||||
|
||||
class SettingsView extends GetView<SettingsController> {
|
||||
const SettingsView({super.key});
|
||||
@ -14,7 +14,7 @@ class SettingsView extends GetView<SettingsController> {
|
||||
appBar: const BaseAppBar('Setting'),
|
||||
body: SingleChildScrollView(
|
||||
physics: const BouncingScrollPhysics(),
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 7.h),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20).w,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0XFF1C1C1D),
|
||||
|
||||
@ -1,19 +1,17 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:now_wallpaper/routes/app_pages.dart';
|
||||
import 'package:hello_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:hello_wallpaper/routes/app_pages.dart';
|
||||
|
||||
class SplashScreenController extends GetxController {
|
||||
Timer? _timer;
|
||||
int _timeCount = 15;
|
||||
int _timeCount = 1;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
ApplovinManage().initializeInterstitialAds(
|
||||
onAdLoadedCallback: _openHomePage,
|
||||
);
|
||||
ApplovinManage().initializeInterstitialAds(onGoHomeTap: _openHomePage);
|
||||
_startTimer();
|
||||
}
|
||||
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/modules/splash_screen/splash_screen_controller.dart';
|
||||
import 'package:now_wallpaper/res/values/strings.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/modules/splash_screen/splash_screen_controller.dart';
|
||||
import 'package:hello_wallpaper/res/values/strings.dart';
|
||||
|
||||
class SplashScreenView extends GetView<SplashScreenController> {
|
||||
const SplashScreenView({super.key});
|
||||
|
||||
@ -5,26 +5,26 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||
import 'package:now_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:hello_wallpaper/applovin_max/applovin_manage.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:now_wallpaper/common/components/dialog/bottomsheet_dialog.dart';
|
||||
import 'package:now_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:now_wallpaper/common/storage/favorite_data.dart';
|
||||
import 'package:now_wallpaper/common/utils/device_info_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/download_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/obj_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/permission_util.dart';
|
||||
import 'package:now_wallpaper/common/utils/wallpaper_manage.dart';
|
||||
import 'package:now_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:now_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
import 'package:hello_wallpaper/common/components/dialog/bottomsheet_dialog.dart';
|
||||
import 'package:hello_wallpaper/common/components/easy_loading.dart';
|
||||
import 'package:hello_wallpaper/common/storage/favorite_data.dart';
|
||||
import 'package:hello_wallpaper/common/utils/device_info_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/download_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/local_path_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/obj_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/permission_util.dart';
|
||||
import 'package:hello_wallpaper/common/utils/wallpaper_manage.dart';
|
||||
import 'package:hello_wallpaper/models/wallpaper_model.dart';
|
||||
import 'package:hello_wallpaper/modules/favorite/favorite_controller.dart';
|
||||
|
||||
class WallpaperDetController extends GetxController {
|
||||
late final List<GlobalKey> globalKey;
|
||||
late final PageController pageController;
|
||||
late final List<WallpaperData> wallpaperList;
|
||||
late final PageController pageController;
|
||||
var blurs = <bool>[].obs;
|
||||
var position = 0;
|
||||
var showBlur = false.obs;
|
||||
var filePath = '';
|
||||
|
||||
@override
|
||||
@ -33,24 +33,30 @@ class WallpaperDetController extends GetxController {
|
||||
position = Get.arguments['position'] ?? 0;
|
||||
wallpaperList = Get.arguments['wallpaperList'] ?? <WallpaperData>[];
|
||||
globalKey = List.generate(wallpaperList.length, (index) => GlobalKey());
|
||||
blurs.value = List.generate(wallpaperList.length, (index) => false);
|
||||
pageController = PageController(initialPage: position);
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
pageController.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
/// 图片切换
|
||||
void onPageChanged(int index) {
|
||||
position = index;
|
||||
filePath = '';
|
||||
showBlur.value = false;
|
||||
}
|
||||
|
||||
/// 设置滤镜
|
||||
void onTapBlur() {
|
||||
showBlur.value = !showBlur.value;
|
||||
blurs[position] = !blurs[position];
|
||||
}
|
||||
|
||||
/// 下载
|
||||
void onTapDownload() {
|
||||
if (showBlur.value) {
|
||||
if (blurs[position]) {
|
||||
// 若是模糊状态,直接捕获保存
|
||||
_captureScreenshot();
|
||||
return;
|
||||
@ -100,7 +106,7 @@ class WallpaperDetController extends GetxController {
|
||||
void onTapSetWallpaper() async {
|
||||
await ApplovinManage().showAdIfReady(ApplovinManage().adUnitId2);
|
||||
BottomSheetDialog.show((location) async {
|
||||
if (showBlur.value) {
|
||||
if (blurs[position]) {
|
||||
await _captureScreenshot();
|
||||
} else {
|
||||
if (ObjUtil.isNotEmptyStr(filePath)) {
|
||||
|
||||
@ -5,14 +5,13 @@ import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hello_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/generated/assets.dart';
|
||||
import 'package:hello_wallpaper/modules/wallpaper_det/wallpaper_det_controller.dart';
|
||||
import 'package:photo_view/photo_view.dart';
|
||||
import 'package:now_wallpaper/common/components/button/base_textbutton.dart';
|
||||
import 'package:now_wallpaper/common/components/image_network_widget.dart';
|
||||
import 'package:now_wallpaper/common/components/keep_alive_wrapper.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:now_wallpaper/generated/assets.dart';
|
||||
import 'package:now_wallpaper/modules/wallpaper_det/wallpaper_det_controller.dart';
|
||||
import 'package:photo_view/photo_view_gallery.dart';
|
||||
|
||||
class WallpaperDetView extends GetView<WallpaperDetController> {
|
||||
const WallpaperDetView({super.key});
|
||||
@ -21,6 +20,7 @@ class WallpaperDetView extends GetView<WallpaperDetController> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
extendBodyBehindAppBar: true,
|
||||
extendBody: true,
|
||||
appBar: BaseAppBar(
|
||||
'',
|
||||
backgroundColor: Colors.transparent,
|
||||
@ -29,7 +29,7 @@ class WallpaperDetView extends GetView<WallpaperDetController> {
|
||||
body: Stack(
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
Obx(() => _buildPhotoView()),
|
||||
_buildPhotoView(),
|
||||
_buildBottomOption(),
|
||||
],
|
||||
),
|
||||
@ -64,42 +64,36 @@ class WallpaperDetView extends GetView<WallpaperDetController> {
|
||||
|
||||
/// 图片PageView
|
||||
Widget _buildPhotoView() {
|
||||
return PageView(
|
||||
physics: const BouncingScrollPhysics(),
|
||||
controller: controller.pageController,
|
||||
onPageChanged: (index) => controller.onPageChanged(index),
|
||||
children: controller.wallpaperList.asMap().entries.map((e) {
|
||||
return KeepAliveWrapper(
|
||||
child: Visibility(
|
||||
visible: controller.showBlur.value,
|
||||
replacement: PhotoView(
|
||||
imageProvider: CachedNetworkImageProvider('${e.value.original}'),
|
||||
initialScale: PhotoViewComputedScale.covered,
|
||||
minScale: PhotoViewComputedScale.contained * 0.5,
|
||||
maxScale: PhotoViewComputedScale.covered * 3,
|
||||
loadingBuilder: (context, event) => loadingView(),
|
||||
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) => errorView,
|
||||
),
|
||||
child: RepaintBoundary(
|
||||
key: controller.globalKey[e.key],
|
||||
child: PhotoView.customChild(
|
||||
initialScale: PhotoViewComputedScale.contained,
|
||||
minScale: PhotoViewComputedScale.contained * 0.5,
|
||||
maxScale: PhotoViewComputedScale.covered * 3,
|
||||
child: ImageFiltered(
|
||||
imageFilter: ImageFilter.blur(sigmaX: 5, sigmaY: 5, tileMode: TileMode.clamp),
|
||||
child: ImageNetworkWidget(
|
||||
url: e.value.original,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
return PhotoViewGallery.builder(
|
||||
itemCount: controller.wallpaperList.length,
|
||||
scrollPhysics: const BouncingScrollPhysics(),
|
||||
wantKeepAlive: true,
|
||||
gaplessPlayback: true,
|
||||
builder: (context, index) {
|
||||
return PhotoViewGalleryPageOptions.customChild(
|
||||
child: RepaintBoundary(
|
||||
key: controller.globalKey[index],
|
||||
child: Obx(() {
|
||||
return ImageFiltered(
|
||||
enabled: controller.blurs[index],
|
||||
imageFilter: ImageFilter.blur(sigmaX: 5, sigmaY: 5, tileMode: TileMode.clamp,),
|
||||
child: PhotoView(
|
||||
enableRotation: true,
|
||||
imageProvider: CachedNetworkImageProvider('${controller.wallpaperList[index].original}'),
|
||||
initialScale: PhotoViewComputedScale.covered,
|
||||
minScale: PhotoViewComputedScale.contained * 0.5,
|
||||
maxScale: PhotoViewComputedScale.covered * 3,
|
||||
loadingBuilder: (context, event) => loadingView(),
|
||||
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) => errorView,
|
||||
heroAttributes: PhotoViewHeroAttributes(tag: '${controller.position}-${controller.wallpaperList[index].original}'),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
},
|
||||
pageController: controller.pageController,
|
||||
onPageChanged: (index) => controller.onPageChanged(index),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class WebPageController extends GetxController {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:now_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:now_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:hello_wallpaper/common/components/navigation_bar/base_appbar.dart';
|
||||
import 'package:hello_wallpaper/common/components/view_state_widget.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
import 'web_page_controller.dart';
|
||||
|
||||
|
||||