@ -0,0 +1,94 @@ |
||||
import 'package:cached_network_image/cached_network_image.dart' |
||||
show CachedNetworkImageProvider; |
||||
import 'package:desktop_drop/desktop_drop.dart' show DropTarget; |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/extensions.dart' show isAndroid, isIOS, isWeb; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; |
||||
import 'package:flutter_quill_extensions/presentation/embeds/widgets/image.dart' |
||||
show getImageProviderByImageSource, imageFileExtensions; |
||||
|
||||
import '../extensions/scaffold_messenger.dart'; |
||||
|
||||
class MyQuillEditor extends StatelessWidget { |
||||
const MyQuillEditor({ |
||||
required this.configurations, |
||||
required this.scrollController, |
||||
required this.focusNode, |
||||
super.key, |
||||
}); |
||||
|
||||
final QuillEditorConfigurations configurations; |
||||
final ScrollController scrollController; |
||||
final FocusNode focusNode; |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return QuillEditor( |
||||
scrollController: scrollController, |
||||
focusNode: focusNode, |
||||
configurations: configurations.copyWith( |
||||
scrollable: true, |
||||
placeholder: 'Start writting your notes...', |
||||
padding: const EdgeInsets.all(16), |
||||
embedBuilders: isWeb() |
||||
? FlutterQuillEmbeds.editorWebBuilders() |
||||
: FlutterQuillEmbeds.editorBuilders( |
||||
imageEmbedConfigurations: QuillEditorImageEmbedConfigurations( |
||||
imageErrorWidgetBuilder: (context, error, stackTrace) { |
||||
return Text( |
||||
'Error while loading an image: ${error.toString()}', |
||||
); |
||||
}, |
||||
imageProviderBuilder: (imageUrl) { |
||||
// cached_network_image is supported |
||||
// only for Android, iOS and web |
||||
|
||||
// We will use it only if image from network |
||||
if (isAndroid(supportWeb: false) || |
||||
isIOS(supportWeb: false) || |
||||
isWeb()) { |
||||
if (isHttpBasedUrl(imageUrl)) { |
||||
return CachedNetworkImageProvider( |
||||
imageUrl, |
||||
); |
||||
} |
||||
} |
||||
return getImageProviderByImageSource( |
||||
imageUrl, |
||||
imageProviderBuilder: null, |
||||
assetsPrefix: QuillSharedExtensionsConfigurations.get( |
||||
context: context) |
||||
.assetsPrefix, |
||||
); |
||||
}, |
||||
), |
||||
), |
||||
builder: (context, rawEditor) { |
||||
// The `desktop_drop` plugin doesn't support iOS platform for now |
||||
if (isIOS(supportWeb: false)) { |
||||
return rawEditor; |
||||
} |
||||
return DropTarget( |
||||
onDragDone: (details) { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final file = details.files.first; |
||||
final isSupported = imageFileExtensions.any(file.name.endsWith); |
||||
if (!isSupported) { |
||||
scaffoldMessenger.showText( |
||||
'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions', |
||||
); |
||||
return; |
||||
} |
||||
context.requireQuillController.insertImageBlock( |
||||
imageSource: file.path, |
||||
); |
||||
scaffoldMessenger.showText('Image is inserted.'); |
||||
}, |
||||
child: rawEditor, |
||||
); |
||||
}, |
||||
), |
||||
); |
||||
} |
||||
} |
@ -0,0 +1,236 @@ |
||||
import 'dart:io' as io show File; |
||||
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_bloc/flutter_bloc.dart'; |
||||
import 'package:flutter_quill/extensions.dart' show isAndroid, isIOS, isWeb; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; |
||||
import 'package:image_cropper/image_cropper.dart'; |
||||
import 'package:path/path.dart' as path; |
||||
import 'package:path_provider/path_provider.dart' |
||||
show getApplicationDocumentsDirectory; |
||||
|
||||
import '../extensions/scaffold_messenger.dart'; |
||||
import '../settings/cubit/settings_cubit.dart'; |
||||
|
||||
class MyQuillToolbar extends StatelessWidget { |
||||
const MyQuillToolbar({super.key}); |
||||
|
||||
Future<void> onImageInsertWithCropping( |
||||
String image, |
||||
QuillController controller, |
||||
BuildContext context, |
||||
) async { |
||||
final croppedFile = await ImageCropper().cropImage( |
||||
sourcePath: image, |
||||
aspectRatioPresets: [ |
||||
CropAspectRatioPreset.square, |
||||
CropAspectRatioPreset.ratio3x2, |
||||
CropAspectRatioPreset.original, |
||||
CropAspectRatioPreset.ratio4x3, |
||||
CropAspectRatioPreset.ratio16x9 |
||||
], |
||||
uiSettings: [ |
||||
AndroidUiSettings( |
||||
toolbarTitle: 'Cropper', |
||||
toolbarColor: Colors.deepOrange, |
||||
toolbarWidgetColor: Colors.white, |
||||
initAspectRatio: CropAspectRatioPreset.original, |
||||
lockAspectRatio: false, |
||||
), |
||||
IOSUiSettings( |
||||
title: 'Cropper', |
||||
), |
||||
WebUiSettings( |
||||
context: context, |
||||
), |
||||
], |
||||
); |
||||
final newImage = croppedFile?.path; |
||||
if (newImage == null) { |
||||
return; |
||||
} |
||||
if (isWeb()) { |
||||
controller.insertImageBlock(imageSource: newImage); |
||||
return; |
||||
} |
||||
final newSavedImage = await saveImage(io.File(newImage)); |
||||
controller.insertImageBlock(imageSource: newSavedImage); |
||||
} |
||||
|
||||
Future<void> onImageInsert(String image, QuillController controller) async { |
||||
if (isWeb()) { |
||||
controller.insertImageBlock(imageSource: image); |
||||
return; |
||||
} |
||||
final newSavedImage = await saveImage(io.File(image)); |
||||
controller.insertImageBlock(imageSource: newSavedImage); |
||||
} |
||||
|
||||
/// Copies the picked file from temporary cache to applications directory |
||||
Future<String> saveImage(io.File file) async { |
||||
final appDocDir = await getApplicationDocumentsDirectory(); |
||||
final copiedFile = await file.copy(path.join( |
||||
appDocDir.path, |
||||
'${DateTime.now().toIso8601String()}${path.extension(file.path)}', |
||||
)); |
||||
return copiedFile.path; |
||||
} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return BlocBuilder<SettingsCubit, SettingsState>( |
||||
buildWhen: (previous, current) => |
||||
previous.useCustomQuillToolbar != current.useCustomQuillToolbar, |
||||
builder: (context, state) { |
||||
if (state.useCustomQuillToolbar) { |
||||
// For more info |
||||
// https://github.com/singerdmx/flutter-quill/blob/master/doc/custom_toolbar.md |
||||
return QuillToolbarProvider( |
||||
toolbarConfigurations: const QuillToolbarConfigurations(), |
||||
child: QuillBaseToolbar( |
||||
configurations: QuillBaseToolbarConfigurations( |
||||
toolbarSize: 15 * 2, |
||||
multiRowsDisplay: false, |
||||
childrenBuilder: (context) { |
||||
final controller = context.requireQuillController; |
||||
return [ |
||||
QuillToolbarImageButton( |
||||
controller: controller, |
||||
options: const QuillToolbarImageButtonOptions(), |
||||
), |
||||
QuillToolbarHistoryButton( |
||||
controller: controller, |
||||
options: |
||||
const QuillToolbarHistoryButtonOptions(isUndo: true), |
||||
), |
||||
QuillToolbarHistoryButton( |
||||
controller: controller, |
||||
options: |
||||
const QuillToolbarHistoryButtonOptions(isUndo: false), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.bold, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_bold, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.italic, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_italic, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.underline, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_underline, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarClearFormatButton( |
||||
controller: controller, |
||||
options: const QuillToolbarClearFormatButtonOptions( |
||||
iconData: Icons.format_clear, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
VerticalDivider( |
||||
indent: 12, |
||||
endIndent: 12, |
||||
color: Colors.grey.shade400, |
||||
), |
||||
QuillToolbarSelectHeaderStyleButtons( |
||||
controller: controller, |
||||
options: |
||||
const QuillToolbarSelectHeaderStyleButtonsOptions( |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.ol, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_list_numbered, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.ul, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_list_bulleted, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
QuillToolbarToggleStyleButton( |
||||
attribute: Attribute.blockQuote, |
||||
controller: controller, |
||||
options: const QuillToolbarToggleStyleButtonOptions( |
||||
iconData: Icons.format_quote, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
VerticalDivider( |
||||
indent: 12, |
||||
endIndent: 12, |
||||
color: Colors.grey.shade400, |
||||
), |
||||
QuillToolbarIndentButton( |
||||
controller: controller, |
||||
isIncrease: true, |
||||
options: const QuillToolbarIndentButtonOptions( |
||||
iconData: Icons.format_indent_increase, |
||||
iconSize: 20, |
||||
)), |
||||
QuillToolbarIndentButton( |
||||
controller: controller, |
||||
isIncrease: false, |
||||
options: const QuillToolbarIndentButtonOptions( |
||||
iconData: Icons.format_indent_decrease, |
||||
iconSize: 20, |
||||
), |
||||
), |
||||
]; |
||||
}, |
||||
), |
||||
), |
||||
); |
||||
} |
||||
return QuillToolbar( |
||||
configurations: QuillToolbarConfigurations( |
||||
customButtons: [ |
||||
QuillToolbarCustomButtonOptions( |
||||
icon: const Icon(Icons.ac_unit), |
||||
onPressed: () { |
||||
ScaffoldMessenger.of(context) |
||||
..clearSnackBars() |
||||
..showText( |
||||
'Custom button!', |
||||
); |
||||
}, |
||||
), |
||||
], |
||||
embedButtons: FlutterQuillEmbeds.toolbarButtons( |
||||
imageButtonOptions: QuillToolbarImageButtonOptions( |
||||
imageButtonConfigurations: QuillToolbarImageConfigurations( |
||||
onImageInsertCallback: isAndroid(supportWeb: false) || |
||||
isIOS(supportWeb: false) || |
||||
isWeb() |
||||
? (image, controller) => |
||||
onImageInsertWithCropping(image, controller, context) |
||||
: onImageInsert, |
||||
), |
||||
), |
||||
), |
||||
), |
||||
); |
||||
}, |
||||
); |
||||
} |
||||
} |
@ -0,0 +1,19 @@ |
||||
const quillVideosSample = [ |
||||
{'insert': '\n'}, |
||||
{ |
||||
'insert': {'video': 'https://youtu.be/xz6_AlJkDPA'}, |
||||
'attributes': { |
||||
'width': '300', |
||||
'height': '300', |
||||
'style': 'width:400px; height:500px;' |
||||
} |
||||
}, |
||||
{'insert': '\n'}, |
||||
{'insert': '\n'}, |
||||
{'insert': 'And this is just a youtube video'}, |
||||
{'insert': '\n'}, |
||||
{ |
||||
'insert': 'This sample is not complete.', |
||||
}, |
||||
{'insert': '\n'}, |
||||
]; |
@ -1,42 +0,0 @@ |
||||
# Miscellaneous |
||||
*.class |
||||
*.log |
||||
*.pyc |
||||
*.swp |
||||
.DS_Store |
||||
.atom/ |
||||
.buildlog/ |
||||
.history |
||||
.svn/ |
||||
|
||||
# IntelliJ related |
||||
*.iml |
||||
*.ipr |
||||
*.iws |
||||
.idea/ |
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in |
||||
# VS Code which you may wish to be included in version control, so this line |
||||
# is commented out by default. |
||||
#.vscode/ |
||||
|
||||
# Flutter/Dart/Pub related |
||||
**/doc/api/ |
||||
**/ios/Flutter/.last_build_id |
||||
.dart_tool/ |
||||
.flutter-plugins |
||||
.flutter-plugins-dependencies |
||||
.packages |
||||
.pub-cache/ |
||||
.pub/ |
||||
/build/ |
||||
|
||||
# Web related |
||||
lib/generated_plugin_registrant.dart |
||||
|
||||
# Symbolication related |
||||
app.*.symbols |
||||
|
||||
# Obfuscation related |
||||
app.*.map.json |
||||
pubspec.lock |
@ -1,45 +0,0 @@ |
||||
# This file tracks properties of this Flutter project. |
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc. |
||||
# |
||||
# This file should be version controlled and should not be manually edited. |
||||
|
||||
version: |
||||
revision: "d211f42860350d914a5ad8102f9ec32764dc6d06" |
||||
channel: "stable" |
||||
|
||||
project_type: app |
||||
|
||||
# Tracks metadata for the flutter migrate command |
||||
migration: |
||||
platforms: |
||||
- platform: root |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: android |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: ios |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: linux |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: macos |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: web |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
- platform: windows |
||||
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06 |
||||
|
||||
# User provided section |
||||
|
||||
# List of Local paths (relative to this file) that should be |
||||
# ignored by the migrate tool. |
||||
# |
||||
# Files that are not part of the templates will be ignored by default. |
||||
unmanaged_files: |
||||
- 'lib/main.dart' |
||||
- 'ios/Runner.xcodeproj/project.pbxproj' |
@ -1,11 +0,0 @@ |
||||
# Demo |
||||
|
||||
This is just a demo of Flutter Quill |
||||
|
||||
|
||||
## Screenshots |
||||
|
||||
<img src="./assets/images/1.png" width="150" alt="Screenshot 1"> |
||||
<img src="./assets/images/2.png" width="150" alt="Screenshot 2"> |
||||
<img src="./assets/images/3.png" width="150" alt="Screenshot 3"> |
||||
<img src="./assets/images/4.png" width="150" alt="Screenshot 4"> |
@ -1,37 +0,0 @@ |
||||
include: package:flutter_lints/flutter.yaml |
||||
|
||||
analyzer: |
||||
errors: |
||||
undefined_prefixed_name: ignore |
||||
unsafe_html: ignore |
||||
linter: |
||||
rules: |
||||
always_declare_return_types: true |
||||
always_put_required_named_parameters_first: true |
||||
annotate_overrides: true |
||||
avoid_empty_else: true |
||||
avoid_escaping_inner_quotes: true |
||||
avoid_print: false |
||||
avoid_redundant_argument_values: true |
||||
avoid_types_on_closure_parameters: true |
||||
avoid_void_async: true |
||||
cascade_invocations: true |
||||
directives_ordering: true |
||||
omit_local_variable_types: true |
||||
prefer_const_constructors: true |
||||
prefer_const_constructors_in_immutables: true |
||||
prefer_const_declarations: true |
||||
prefer_final_fields: true |
||||
prefer_final_in_for_each: true |
||||
prefer_final_locals: true |
||||
prefer_initializing_formals: true |
||||
prefer_int_literals: true |
||||
prefer_interpolation_to_compose_strings: true |
||||
prefer_relative_imports: true |
||||
prefer_single_quotes: true |
||||
sort_constructors_first: true |
||||
sort_unnamed_constructors_first: true |
||||
unnecessary_lambdas: true |
||||
unnecessary_parenthesis: true |
||||
unnecessary_string_interpolations: true |
||||
library_private_types_in_public_api: false |
@ -1,13 +0,0 @@ |
||||
gradle-wrapper.jar |
||||
/.gradle |
||||
/captures/ |
||||
/gradlew |
||||
/gradlew.bat |
||||
/local.properties |
||||
GeneratedPluginRegistrant.java |
||||
|
||||
# Remember to never publicly share your keystore. |
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app |
||||
key.properties |
||||
**/*.keystore |
||||
**/*.jks |
@ -1,64 +0,0 @@ |
||||
plugins { |
||||
id "com.android.application" |
||||
id "kotlin-android" |
||||
id "dev.flutter.flutter-gradle-plugin" |
||||
} |
||||
|
||||
def localProperties = new Properties() |
||||
def localPropertiesFile = rootProject.file('local.properties') |
||||
if (localPropertiesFile.exists()) { |
||||
localPropertiesFile.withReader('UTF-8') { reader -> |
||||
localProperties.load(reader) |
||||
} |
||||
} |
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode') |
||||
if (flutterVersionCode == null) { |
||||
flutterVersionCode = '1' |
||||
} |
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName') |
||||
if (flutterVersionName == null) { |
||||
flutterVersionName = '1.0' |
||||
} |
||||
|
||||
android { |
||||
namespace "com.example.example" |
||||
compileSdk flutter.compileSdkVersion |
||||
ndkVersion flutter.ndkVersion |
||||
|
||||
def javaVersion = JavaVersion.VERSION_17 |
||||
|
||||
compileOptions { |
||||
sourceCompatibility javaVersion |
||||
targetCompatibility javaVersion |
||||
} |
||||
|
||||
kotlinOptions { |
||||
jvmTarget = javaVersion.toString() |
||||
} |
||||
|
||||
sourceSets { |
||||
main.java.srcDirs += 'src/main/kotlin' |
||||
} |
||||
|
||||
defaultConfig { |
||||
applicationId "com.example.example" |
||||
minSdkVersion 24 |
||||
targetSdkVersion flutter.targetSdkVersion |
||||
versionCode flutterVersionCode.toInteger() |
||||
versionName flutterVersionName |
||||
} |
||||
|
||||
buildTypes { |
||||
release { |
||||
signingConfig signingConfigs.debug |
||||
} |
||||
} |
||||
} |
||||
|
||||
flutter { |
||||
source '../..' |
||||
} |
||||
|
||||
dependencies {} |
@ -1,7 +0,0 @@ |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<!-- The INTERNET permission is required for development. Specifically, |
||||
the Flutter tool 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> |
@ -1,57 +0,0 @@ |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" /> |
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
||||
<uses-permission android:name="android.permission.CAMERA" /> |
||||
<uses-permission |
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE" |
||||
android:maxSdkVersion="32" /> |
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> |
||||
|
||||
<!-- The camera and gps features will be used --> |
||||
<!-- But it's not required to install the app --> |
||||
<uses-feature |
||||
android:name="android.hardware.location.gps" |
||||
android:required="false" /> |
||||
|
||||
<uses-feature |
||||
android:name="android.hardware.camera" |
||||
android:required="false" /> |
||||
|
||||
<application |
||||
android:name="${applicationName}" |
||||
android:icon="@mipmap/ic_launcher" |
||||
android:label="example"> |
||||
<activity |
||||
android:name=".MainActivity" |
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" |
||||
android:exported="true" |
||||
android:hardwareAccelerated="true" |
||||
android:launchMode="singleTop" |
||||
android:theme="@style/LaunchTheme" |
||||
android:windowSoftInputMode="adjustResize"> |
||||
<!-- Specifies an Android theme to apply to this Activity as soon as |
||||
the Android process has started. This theme is visible to the user |
||||
while the Flutter UI initializes. After that, this theme continues |
||||
to determine the Window background behind the Flutter UI. --> |
||||
<meta-data |
||||
android:name="io.flutter.embedding.android.NormalTheme" |
||||
android:resource="@style/NormalTheme" /> |
||||
<intent-filter> |
||||
<action android:name="android.intent.action.MAIN" /> |
||||
<category android:name="android.intent.category.LAUNCHER" /> |
||||
</intent-filter> |
||||
</activity> |
||||
|
||||
<activity |
||||
android:name="com.yalantis.ucrop.UCropActivity" |
||||
android:screenOrientation="portrait" |
||||
android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> |
||||
|
||||
<!-- Don't delete the meta-data below. |
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> |
||||
<meta-data |
||||
android:name="flutterEmbedding" |
||||
android:value="2" /> |
||||
</application> |
||||
</manifest> |
@ -1,5 +0,0 @@ |
||||
package com.example.example |
||||
|
||||
import io.flutter.embedding.android.FlutterActivity |
||||
|
||||
class MainActivity: FlutterActivity() |
@ -1,12 +0,0 @@ |
||||
<?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" /> |
||||
|
||||
<!-- You can insert your own image assets here --> |
||||
<!-- <item> |
||||
<bitmap |
||||
android:gravity="center" |
||||
android:src="@mipmap/launch_image" /> |
||||
</item> --> |
||||
</layer-list> |
@ -1,12 +0,0 @@ |
||||
<?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> |
Before Width: | Height: | Size: 544 B |
Before Width: | Height: | Size: 442 B |
Before Width: | Height: | Size: 721 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.4 KiB |
@ -1,18 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<resources> |
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> |
||||
<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> |
||||
</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 |
||||
Flutter UI initializes, as well as behind your Flutter UI while its |
||||
running. |
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. --> |
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> |
||||
<item name="android:windowBackground">?android:colorBackground</item> |
||||
</style> |
||||
</resources> |
@ -1,18 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<resources> |
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> |
||||
<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> |
||||
</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 |
||||
Flutter UI initializes, as well as behind your Flutter UI while its |
||||
running. |
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. --> |
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> |
||||
<item name="android:windowBackground">?android:colorBackground</item> |
||||
</style> |
||||
</resources> |
@ -1,7 +0,0 @@ |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
<!-- The INTERNET permission is required for development. Specifically, |
||||
the Flutter tool 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> |
@ -1,74 +0,0 @@ |
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile |
||||
|
||||
buildscript { |
||||
ext.kotlin_version = '1.9.20' |
||||
repositories { |
||||
google() |
||||
mavenCentral() |
||||
} |
||||
|
||||
dependencies { |
||||
classpath 'com.android.tools.build:gradle:8.1.2' |
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" |
||||
} |
||||
} |
||||
|
||||
allprojects { |
||||
repositories { |
||||
google() |
||||
mavenCentral() |
||||
} |
||||
} |
||||
|
||||
rootProject.buildDir = '../build' |
||||
subprojects { |
||||
project.buildDir = "${rootProject.buildDir}/${project.name}" |
||||
|
||||
// For mode details visit https://gist.github.com/freshtechtips/93fefb39e48c40592bda3931e05fd35c |
||||
afterEvaluate { |
||||
// check if android block is available |
||||
|
||||
if (it.hasProperty('android')) { |
||||
|
||||
if (it.android.namespace == null) { |
||||
def manifest = new XmlSlurper().parse(file(it.android.sourceSets.main.manifest.srcFile)) |
||||
def packageName = manifest.@package.text() |
||||
println("Setting ${packageName} as android namespace in build.gradle from the AndroidManifest.xml") |
||||
android.namespace = packageName |
||||
} |
||||
|
||||
def javaVersion = JavaVersion.VERSION_17 |
||||
println("Changes will be applied for the following packages:") |
||||
android { |
||||
def androidApiVersion = 34 |
||||
// compileSdkVersion androidApiVersion |
||||
compileSdk androidApiVersion |
||||
defaultConfig { |
||||
targetSdkVersion androidApiVersion |
||||
} |
||||
compileOptions { |
||||
sourceCompatibility javaVersion |
||||
targetCompatibility javaVersion |
||||
} |
||||
tasks.withType(KotlinCompile).configureEach { |
||||
buildscript { |
||||
ext.kotlin_version = kotlin_version |
||||
} |
||||
kotlinOptions { |
||||
jvmTarget = javaVersion.toString() |
||||
} |
||||
} |
||||
String message = "For package ${android.namespace} by update compileSdkVersion, targetSdkVersion \n to $androidApiVersion and java version to ${javaVersion.toString()}" |
||||
println(message) |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
||||
subprojects { |
||||
project.evaluationDependsOn(':app') |
||||
} |
||||
|
||||
tasks.register("clean", Delete) { |
||||
delete rootProject.buildDir |
||||
} |
@ -1,6 +0,0 @@ |
||||
org.gradle.jvmargs=-Xmx1536M |
||||
android.useAndroidX=true |
||||
android.enableJetifier=true |
||||
android.defaults.buildfeatures.buildconfig=true |
||||
android.nonTransitiveRClass=false |
||||
android.nonFinalResIds=false |
@ -1,5 +0,0 @@ |
||||
distributionBase=GRADLE_USER_HOME |
||||
distributionPath=wrapper/dists |
||||
zipStoreBase=GRADLE_USER_HOME |
||||
zipStorePath=wrapper/dists |
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip |
@ -1,20 +0,0 @@ |
||||
pluginManagement { |
||||
def flutterSdkPath = { |
||||
def properties = new Properties() |
||||
file("local.properties").withInputStream { properties.load(it) } |
||||
def flutterSdkPath = properties.getProperty("flutter.sdk") |
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties" |
||||
return flutterSdkPath |
||||
} |
||||
settings.ext.flutterSdkPath = flutterSdkPath() |
||||
|
||||
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") |
||||
|
||||
plugins { |
||||
id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false |
||||
} |
||||
} |
||||
|
||||
include ":app" |
||||
|
||||
apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" |
Before Width: | Height: | Size: 401 KiB |
Before Width: | Height: | Size: 348 KiB |
Before Width: | Height: | Size: 342 KiB |
Before Width: | Height: | Size: 279 KiB |
@ -1,34 +0,0 @@ |
||||
**/dgph |
||||
*.mode1v3 |
||||
*.mode2v3 |
||||
*.moved-aside |
||||
*.pbxuser |
||||
*.perspectivev3 |
||||
**/*sync/ |
||||
.sconsign.dblite |
||||
.tags* |
||||
**/.vagrant/ |
||||
**/DerivedData/ |
||||
Icon? |
||||
**/Pods/ |
||||
**/.symlinks/ |
||||
profile |
||||
xcuserdata |
||||
**/.generated/ |
||||
Flutter/App.framework |
||||
Flutter/Flutter.framework |
||||
Flutter/Flutter.podspec |
||||
Flutter/Generated.xcconfig |
||||
Flutter/ephemeral/ |
||||
Flutter/app.flx |
||||
Flutter/app.zip |
||||
Flutter/flutter_assets/ |
||||
Flutter/flutter_export_environment.sh |
||||
ServiceDefinitions.json |
||||
Runner/GeneratedPluginRegistrant.* |
||||
|
||||
# Exceptions to above rules. |
||||
!default.mode1v3 |
||||
!default.mode2v3 |
||||
!default.pbxuser |
||||
!default.perspectivev3 |
@ -1,26 +0,0 @@ |
||||
<?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>11.0</string> |
||||
</dict> |
||||
</plist> |
@ -1,2 +0,0 @@ |
||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" |
||||
#include "Generated.xcconfig" |
@ -1,2 +0,0 @@ |
||||
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" |
||||
#include "Generated.xcconfig" |
@ -1,44 +0,0 @@ |
||||
# Uncomment this line to define a global platform for your project |
||||
# platform :ios, '11.0' |
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency. |
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true' |
||||
|
||||
project 'Runner', { |
||||
'Debug' => :debug, |
||||
'Profile' => :release, |
||||
'Release' => :release, |
||||
} |
||||
|
||||
def flutter_root |
||||
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) |
||||
unless File.exist?(generated_xcode_build_settings_path) |
||||
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" |
||||
end |
||||
|
||||
File.foreach(generated_xcode_build_settings_path) do |line| |
||||
matches = line.match(/FLUTTER_ROOT\=(.*)/) |
||||
return matches[1].strip if matches |
||||
end |
||||
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" |
||||
end |
||||
|
||||
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) |
||||
|
||||
flutter_ios_podfile_setup |
||||
|
||||
target 'Runner' do |
||||
use_frameworks! |
||||
use_modular_headers! |
||||
|
||||
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) |
||||
target 'RunnerTests' do |
||||
inherit! :search_paths |
||||
end |
||||
end |
||||
|
||||
post_install do |installer| |
||||
installer.pods_project.targets.each do |target| |
||||
flutter_additional_ios_build_settings(target) |
||||
end |
||||
end |
@ -1,144 +0,0 @@ |
||||
PODS: |
||||
- device_info_plus (0.0.1): |
||||
- Flutter |
||||
- DKImagePickerController/Core (4.3.4): |
||||
- DKImagePickerController/ImageDataManager |
||||
- DKImagePickerController/Resource |
||||
- DKImagePickerController/ImageDataManager (4.3.4) |
||||
- DKImagePickerController/PhotoGallery (4.3.4): |
||||
- DKImagePickerController/Core |
||||
- DKPhotoGallery |
||||
- DKImagePickerController/Resource (4.3.4) |
||||
- DKPhotoGallery (0.0.17): |
||||
- DKPhotoGallery/Core (= 0.0.17) |
||||
- DKPhotoGallery/Model (= 0.0.17) |
||||
- DKPhotoGallery/Preview (= 0.0.17) |
||||
- DKPhotoGallery/Resource (= 0.0.17) |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- DKPhotoGallery/Core (0.0.17): |
||||
- DKPhotoGallery/Model |
||||
- DKPhotoGallery/Preview |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- DKPhotoGallery/Model (0.0.17): |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- DKPhotoGallery/Preview (0.0.17): |
||||
- DKPhotoGallery/Model |
||||
- DKPhotoGallery/Resource |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- DKPhotoGallery/Resource (0.0.17): |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- file_picker (0.0.1): |
||||
- DKImagePickerController/PhotoGallery |
||||
- Flutter |
||||
- Flutter (1.0.0) |
||||
- flutter_inappwebview (0.0.1): |
||||
- Flutter |
||||
- flutter_inappwebview/Core (= 0.0.1) |
||||
- OrderedSet (~> 5.0) |
||||
- flutter_inappwebview/Core (0.0.1): |
||||
- Flutter |
||||
- OrderedSet (~> 5.0) |
||||
- flutter_keyboard_visibility (0.0.1): |
||||
- Flutter |
||||
- gal (1.0.0): |
||||
- Flutter |
||||
- FlutterMacOS |
||||
- image_cropper (0.0.4): |
||||
- Flutter |
||||
- TOCropViewController (~> 2.6.1) |
||||
- image_picker_ios (0.0.1): |
||||
- Flutter |
||||
- OrderedSet (5.0.0) |
||||
- pasteboard (0.0.1): |
||||
- Flutter |
||||
- path_provider_foundation (0.0.1): |
||||
- Flutter |
||||
- FlutterMacOS |
||||
- SDWebImage (5.18.3): |
||||
- SDWebImage/Core (= 5.18.3) |
||||
- SDWebImage/Core (5.18.3) |
||||
- SwiftyGif (5.4.4) |
||||
- TOCropViewController (2.6.1) |
||||
- url_launcher_ios (0.0.1): |
||||
- Flutter |
||||
- video_player_avfoundation (0.0.1): |
||||
- Flutter |
||||
- FlutterMacOS |
||||
|
||||
DEPENDENCIES: |
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) |
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`) |
||||
- Flutter (from `Flutter`) |
||||
- flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`) |
||||
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) |
||||
- gal (from `.symlinks/plugins/gal/darwin`) |
||||
- image_cropper (from `.symlinks/plugins/image_cropper/ios`) |
||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) |
||||
- pasteboard (from `.symlinks/plugins/pasteboard/ios`) |
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) |
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) |
||||
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) |
||||
|
||||
SPEC REPOS: |
||||
trunk: |
||||
- DKImagePickerController |
||||
- DKPhotoGallery |
||||
- OrderedSet |
||||
- SDWebImage |
||||
- SwiftyGif |
||||
- TOCropViewController |
||||
|
||||
EXTERNAL SOURCES: |
||||
device_info_plus: |
||||
:path: ".symlinks/plugins/device_info_plus/ios" |
||||
file_picker: |
||||
:path: ".symlinks/plugins/file_picker/ios" |
||||
Flutter: |
||||
:path: Flutter |
||||
flutter_inappwebview: |
||||
:path: ".symlinks/plugins/flutter_inappwebview/ios" |
||||
flutter_keyboard_visibility: |
||||
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios" |
||||
gal: |
||||
:path: ".symlinks/plugins/gal/darwin" |
||||
image_cropper: |
||||
:path: ".symlinks/plugins/image_cropper/ios" |
||||
image_picker_ios: |
||||
:path: ".symlinks/plugins/image_picker_ios/ios" |
||||
pasteboard: |
||||
:path: ".symlinks/plugins/pasteboard/ios" |
||||
path_provider_foundation: |
||||
:path: ".symlinks/plugins/path_provider_foundation/darwin" |
||||
url_launcher_ios: |
||||
:path: ".symlinks/plugins/url_launcher_ios/ios" |
||||
video_player_avfoundation: |
||||
:path: ".symlinks/plugins/video_player_avfoundation/darwin" |
||||
|
||||
SPEC CHECKSUMS: |
||||
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 |
||||
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac |
||||
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 |
||||
file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de |
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 |
||||
flutter_inappwebview: 3d32228f1304635e7c028b0d4252937730bbc6cf |
||||
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 |
||||
gal: 61e868295d28fe67ffa297fae6dacebf56fd53e1 |
||||
image_cropper: a3291c624a953049bc6a02e1f8c8ceb162a24b25 |
||||
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 |
||||
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c |
||||
pasteboard: 982969ebaa7c78af3e6cc7761e8f5e77565d9ce0 |
||||
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 |
||||
SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958 |
||||
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f |
||||
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 |
||||
url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86 |
||||
video_player_avfoundation: 8563f13d8fc8b2c29dc2d09e60b660e4e8128837 |
||||
|
||||
PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 |
||||
|
||||
COCOAPODS: 1.14.2 |
@ -1,722 +0,0 @@ |
||||
// !$*UTF8*$! |
||||
{ |
||||
archiveVersion = 1; |
||||
classes = { |
||||
}; |
||||
objectVersion = 54; |
||||
objects = { |
||||
|
||||
/* Begin PBXBuildFile section */ |
||||
110D5FB266DE0C87D485C5A1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA159BA3A0CB20166BDC7649 /* Pods_RunnerTests.framework */; }; |
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; |
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; |
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; |
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; |
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; |
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; |
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; |
||||
E0CFF8B0B56159E612BD1BF1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56338E24E520D8744CFF5FE2 /* Pods_Runner.framework */; }; |
||||
/* End PBXBuildFile section */ |
||||
|
||||
/* Begin PBXContainerItemProxy section */ |
||||
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { |
||||
isa = PBXContainerItemProxy; |
||||
containerPortal = 97C146E61CF9000F007C117D /* Project object */; |
||||
proxyType = 1; |
||||
remoteGlobalIDString = 97C146ED1CF9000F007C117D; |
||||
remoteInfo = Runner; |
||||
}; |
||||
/* End PBXContainerItemProxy section */ |
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */ |
||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = { |
||||
isa = PBXCopyFilesBuildPhase; |
||||
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>"; }; |
||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; |
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; |
||||
56338E24E520D8744CFF5FE2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||
6B6E89A47C28537B66DC0FA4 /* 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>"; }; |
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; |
||||
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>"; }; |
||||
7D464E3E73705EDBCA621B35 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; 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; }; |
||||
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>"; }; |
||||
A5625BCCF88D6127AE26675C /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; }; |
||||
CA159BA3A0CB20166BDC7649 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; |
||||
D0600C43B20FD3C51A3985DD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; }; |
||||
E008F2A10A874EB0C8AB0591 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; |
||||
F65D90E41795239C733C3B48 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; |
||||
/* End PBXFileReference section */ |
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */ |
||||
729BF1F2E5A6188112D79F62 /* Frameworks */ = { |
||||
isa = PBXFrameworksBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
110D5FB266DE0C87D485C5A1 /* Pods_RunnerTests.framework in Frameworks */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
97C146EB1CF9000F007C117D /* Frameworks */ = { |
||||
isa = PBXFrameworksBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
E0CFF8B0B56159E612BD1BF1 /* Pods_Runner.framework in Frameworks */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXFrameworksBuildPhase section */ |
||||
|
||||
/* Begin PBXGroup section */ |
||||
331C8082294A63A400263BE5 /* RunnerTests */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
331C807B294A618700263BE5 /* RunnerTests.swift */, |
||||
); |
||||
path = RunnerTests; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
808219EA7A4ECE8B7D2A26F2 /* Frameworks */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
56338E24E520D8744CFF5FE2 /* Pods_Runner.framework */, |
||||
CA159BA3A0CB20166BDC7649 /* Pods_RunnerTests.framework */, |
||||
); |
||||
name = Frameworks; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
839C085E910FF72A20C1DC94 /* Pods */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
E008F2A10A874EB0C8AB0591 /* Pods-Runner.debug.xcconfig */, |
||||
D0600C43B20FD3C51A3985DD /* Pods-Runner.release.xcconfig */, |
||||
F65D90E41795239C733C3B48 /* Pods-Runner.profile.xcconfig */, |
||||
7D464E3E73705EDBCA621B35 /* Pods-RunnerTests.debug.xcconfig */, |
||||
A5625BCCF88D6127AE26675C /* Pods-RunnerTests.release.xcconfig */, |
||||
6B6E89A47C28537B66DC0FA4 /* Pods-RunnerTests.profile.xcconfig */, |
||||
); |
||||
name = Pods; |
||||
path = Pods; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
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 */, |
||||
331C8082294A63A400263BE5 /* RunnerTests */, |
||||
839C085E910FF72A20C1DC94 /* Pods */, |
||||
808219EA7A4ECE8B7D2A26F2 /* Frameworks */, |
||||
); |
||||
sourceTree = "<group>"; |
||||
}; |
||||
97C146EF1CF9000F007C117D /* Products */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
97C146EE1CF9000F007C117D /* Runner.app */, |
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */, |
||||
); |
||||
name = Products; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
97C146F01CF9000F007C117D /* Runner */ = { |
||||
isa = PBXGroup; |
||||
children = ( |
||||
97C146FA1CF9000F007C117D /* Main.storyboard */, |
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */, |
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, |
||||
97C147021CF9000F007C117D /* Info.plist */, |
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, |
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, |
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */, |
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, |
||||
); |
||||
path = Runner; |
||||
sourceTree = "<group>"; |
||||
}; |
||||
/* End PBXGroup section */ |
||||
|
||||
/* Begin PBXNativeTarget section */ |
||||
331C8080294A63A400263BE5 /* RunnerTests */ = { |
||||
isa = PBXNativeTarget; |
||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; |
||||
buildPhases = ( |
||||
81CBE292094CBE166A4095F9 /* [CP] Check Pods Manifest.lock */, |
||||
331C807D294A63A400263BE5 /* Sources */, |
||||
331C807F294A63A400263BE5 /* Resources */, |
||||
729BF1F2E5A6188112D79F62 /* Frameworks */, |
||||
); |
||||
buildRules = ( |
||||
); |
||||
dependencies = ( |
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */, |
||||
); |
||||
name = RunnerTests; |
||||
productName = RunnerTests; |
||||
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; |
||||
productType = "com.apple.product-type.bundle.unit-test"; |
||||
}; |
||||
97C146ED1CF9000F007C117D /* Runner */ = { |
||||
isa = PBXNativeTarget; |
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; |
||||
buildPhases = ( |
||||
06DBD2892C9AFDD9AA47E269 /* [CP] Check Pods Manifest.lock */, |
||||
9740EEB61CF901F6004384FC /* Run Script */, |
||||
97C146EA1CF9000F007C117D /* Sources */, |
||||
97C146EB1CF9000F007C117D /* Frameworks */, |
||||
97C146EC1CF9000F007C117D /* Resources */, |
||||
9705A1C41CF9048500538489 /* Embed Frameworks */, |
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */, |
||||
7C1D0099598B9B03C264FE8E /* [CP] Embed Pods Frameworks */, |
||||
); |
||||
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 = { |
||||
BuildIndependentTargetsInParallel = YES; |
||||
LastUpgradeCheck = 1430; |
||||
ORGANIZATIONNAME = ""; |
||||
TargetAttributes = { |
||||
331C8080294A63A400263BE5 = { |
||||
CreatedOnToolsVersion = 14.0; |
||||
TestTargetID = 97C146ED1CF9000F007C117D; |
||||
}; |
||||
97C146ED1CF9000F007C117D = { |
||||
CreatedOnToolsVersion = 7.3.1; |
||||
LastSwiftMigration = 1100; |
||||
}; |
||||
}; |
||||
}; |
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; |
||||
compatibilityVersion = "Xcode 9.3"; |
||||
developmentRegion = en; |
||||
hasScannedForEncodings = 0; |
||||
knownRegions = ( |
||||
en, |
||||
Base, |
||||
); |
||||
mainGroup = 97C146E51CF9000F007C117D; |
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */; |
||||
projectDirPath = ""; |
||||
projectRoot = ""; |
||||
targets = ( |
||||
97C146ED1CF9000F007C117D /* Runner */, |
||||
331C8080294A63A400263BE5 /* RunnerTests */, |
||||
); |
||||
}; |
||||
/* End PBXProject section */ |
||||
|
||||
/* Begin PBXResourcesBuildPhase section */ |
||||
331C807F294A63A400263BE5 /* Resources */ = { |
||||
isa = PBXResourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
97C146EC1CF9000F007C117D /* Resources */ = { |
||||
isa = PBXResourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, |
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, |
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, |
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXResourcesBuildPhase section */ |
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */ |
||||
06DBD2892C9AFDD9AA47E269 /* [CP] Check Pods Manifest.lock */ = { |
||||
isa = PBXShellScriptBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
); |
||||
inputFileListPaths = ( |
||||
); |
||||
inputPaths = ( |
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock", |
||||
"${PODS_ROOT}/Manifest.lock", |
||||
); |
||||
name = "[CP] Check Pods Manifest.lock"; |
||||
outputFileListPaths = ( |
||||
); |
||||
outputPaths = ( |
||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
shellPath = /bin/sh; |
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
||||
showEnvVarsInLog = 0; |
||||
}; |
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { |
||||
isa = PBXShellScriptBuildPhase; |
||||
alwaysOutOfDate = 1; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
); |
||||
inputPaths = ( |
||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", |
||||
); |
||||
name = "Thin Binary"; |
||||
outputPaths = ( |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
shellPath = /bin/sh; |
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; |
||||
}; |
||||
7C1D0099598B9B03C264FE8E /* [CP] Embed Pods Frameworks */ = { |
||||
isa = PBXShellScriptBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
); |
||||
inputFileListPaths = ( |
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", |
||||
); |
||||
name = "[CP] Embed Pods Frameworks"; |
||||
outputFileListPaths = ( |
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
shellPath = /bin/sh; |
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; |
||||
showEnvVarsInLog = 0; |
||||
}; |
||||
81CBE292094CBE166A4095F9 /* [CP] Check Pods Manifest.lock */ = { |
||||
isa = PBXShellScriptBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
); |
||||
inputFileListPaths = ( |
||||
); |
||||
inputPaths = ( |
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock", |
||||
"${PODS_ROOT}/Manifest.lock", |
||||
); |
||||
name = "[CP] Check Pods Manifest.lock"; |
||||
outputFileListPaths = ( |
||||
); |
||||
outputPaths = ( |
||||
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
shellPath = /bin/sh; |
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
||||
showEnvVarsInLog = 0; |
||||
}; |
||||
9740EEB61CF901F6004384FC /* Run Script */ = { |
||||
isa = PBXShellScriptBuildPhase; |
||||
alwaysOutOfDate = 1; |
||||
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 */ |
||||
331C807D294A63A400263BE5 /* Sources */ = { |
||||
isa = PBXSourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
97C146EA1CF9000F007C117D /* Sources */ = { |
||||
isa = PBXSourcesBuildPhase; |
||||
buildActionMask = 2147483647; |
||||
files = ( |
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, |
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, |
||||
); |
||||
runOnlyForDeploymentPostprocessing = 0; |
||||
}; |
||||
/* End PBXSourcesBuildPhase section */ |
||||
|
||||
/* Begin PBXTargetDependency section */ |
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */ = { |
||||
isa = PBXTargetDependency; |
||||
target = 97C146ED1CF9000F007C117D /* Runner */; |
||||
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; |
||||
}; |
||||
/* End PBXTargetDependency section */ |
||||
|
||||
/* Begin PBXVariantGroup section */ |
||||
97C146FA1CF9000F007C117D /* Main.storyboard */ = { |
||||
isa = PBXVariantGroup; |
||||
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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 11.0; |
||||
MTL_ENABLE_DEBUG_INFO = NO; |
||||
SDKROOT = iphoneos; |
||||
SUPPORTED_PLATFORMS = 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; |
||||
CLANG_ENABLE_MODULES = YES; |
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; |
||||
ENABLE_BITCODE = NO; |
||||
INFOPLIST_FILE = Runner/Info.plist; |
||||
LD_RUNPATH_SEARCH_PATHS = ( |
||||
"$(inherited)", |
||||
"@executable_path/Frameworks", |
||||
); |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; |
||||
SWIFT_VERSION = 5.0; |
||||
VERSIONING_SYSTEM = "apple-generic"; |
||||
}; |
||||
name = Profile; |
||||
}; |
||||
331C8088294A63A400263BE5 /* Debug */ = { |
||||
isa = XCBuildConfiguration; |
||||
baseConfigurationReference = 7D464E3E73705EDBCA621B35 /* Pods-RunnerTests.debug.xcconfig */; |
||||
buildSettings = { |
||||
BUNDLE_LOADER = "$(TEST_HOST)"; |
||||
CODE_SIGN_STYLE = Automatic; |
||||
CURRENT_PROJECT_VERSION = 1; |
||||
GENERATE_INFOPLIST_FILE = YES; |
||||
MARKETING_VERSION = 1.0; |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; |
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; |
||||
SWIFT_VERSION = 5.0; |
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; |
||||
}; |
||||
name = Debug; |
||||
}; |
||||
331C8089294A63A400263BE5 /* Release */ = { |
||||
isa = XCBuildConfiguration; |
||||
baseConfigurationReference = A5625BCCF88D6127AE26675C /* Pods-RunnerTests.release.xcconfig */; |
||||
buildSettings = { |
||||
BUNDLE_LOADER = "$(TEST_HOST)"; |
||||
CODE_SIGN_STYLE = Automatic; |
||||
CURRENT_PROJECT_VERSION = 1; |
||||
GENERATE_INFOPLIST_FILE = YES; |
||||
MARKETING_VERSION = 1.0; |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_VERSION = 5.0; |
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; |
||||
}; |
||||
name = Release; |
||||
}; |
||||
331C808A294A63A400263BE5 /* Profile */ = { |
||||
isa = XCBuildConfiguration; |
||||
baseConfigurationReference = 6B6E89A47C28537B66DC0FA4 /* Pods-RunnerTests.profile.xcconfig */; |
||||
buildSettings = { |
||||
BUNDLE_LOADER = "$(TEST_HOST)"; |
||||
CODE_SIGN_STYLE = Automatic; |
||||
CURRENT_PROJECT_VERSION = 1; |
||||
GENERATE_INFOPLIST_FILE = YES; |
||||
MARKETING_VERSION = 1.0; |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example.RunnerTests; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_VERSION = 5.0; |
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; |
||||
}; |
||||
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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 11.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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 11.0; |
||||
MTL_ENABLE_DEBUG_INFO = NO; |
||||
SDKROOT = iphoneos; |
||||
SUPPORTED_PLATFORMS = iphoneos; |
||||
SWIFT_COMPILATION_MODE = wholemodule; |
||||
SWIFT_OPTIMIZATION_LEVEL = "-O"; |
||||
TARGETED_DEVICE_FAMILY = "1,2"; |
||||
VALIDATE_PRODUCT = YES; |
||||
}; |
||||
name = Release; |
||||
}; |
||||
97C147061CF9000F007C117D /* Debug */ = { |
||||
isa = XCBuildConfiguration; |
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; |
||||
buildSettings = { |
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
||||
CLANG_ENABLE_MODULES = YES; |
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; |
||||
ENABLE_BITCODE = NO; |
||||
INFOPLIST_FILE = Runner/Info.plist; |
||||
LD_RUNPATH_SEARCH_PATHS = ( |
||||
"$(inherited)", |
||||
"@executable_path/Frameworks", |
||||
); |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; |
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; |
||||
SWIFT_VERSION = 5.0; |
||||
VERSIONING_SYSTEM = "apple-generic"; |
||||
}; |
||||
name = Debug; |
||||
}; |
||||
97C147071CF9000F007C117D /* Release */ = { |
||||
isa = XCBuildConfiguration; |
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; |
||||
buildSettings = { |
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
||||
CLANG_ENABLE_MODULES = YES; |
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; |
||||
ENABLE_BITCODE = NO; |
||||
INFOPLIST_FILE = Runner/Info.plist; |
||||
LD_RUNPATH_SEARCH_PATHS = ( |
||||
"$(inherited)", |
||||
"@executable_path/Frameworks", |
||||
); |
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.example; |
||||
PRODUCT_NAME = "$(TARGET_NAME)"; |
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; |
||||
SWIFT_VERSION = 5.0; |
||||
VERSIONING_SYSTEM = "apple-generic"; |
||||
}; |
||||
name = Release; |
||||
}; |
||||
/* End XCBuildConfiguration section */ |
||||
|
||||
/* Begin XCConfigurationList section */ |
||||
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { |
||||
isa = XCConfigurationList; |
||||
buildConfigurations = ( |
||||
331C8088294A63A400263BE5 /* Debug */, |
||||
331C8089294A63A400263BE5 /* Release */, |
||||
331C808A294A63A400263BE5 /* Profile */, |
||||
); |
||||
defaultConfigurationIsVisible = 0; |
||||
defaultConfigurationName = Release; |
||||
}; |
||||
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 */; |
||||
} |
@ -1,7 +0,0 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Workspace |
||||
version = "1.0"> |
||||
<FileRef |
||||
location = "self:"> |
||||
</FileRef> |
||||
</Workspace> |
@ -1,8 +0,0 @@ |
||||
<?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>IDEDidComputeMac32BitWarning</key> |
||||
<true/> |
||||
</dict> |
||||
</plist> |
@ -1,8 +0,0 @@ |
||||
<?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>PreviewsEnabled</key> |
||||
<false/> |
||||
</dict> |
||||
</plist> |
@ -1,98 +0,0 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Scheme |
||||
LastUpgradeVersion = "1430" |
||||
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" |
||||
shouldUseLaunchSchemeArgsEnv = "YES"> |
||||
<MacroExpansion> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D" |
||||
BuildableName = "Runner.app" |
||||
BlueprintName = "Runner" |
||||
ReferencedContainer = "container:Runner.xcodeproj"> |
||||
</BuildableReference> |
||||
</MacroExpansion> |
||||
<Testables> |
||||
<TestableReference |
||||
skipped = "NO" |
||||
parallelizable = "YES"> |
||||
<BuildableReference |
||||
BuildableIdentifier = "primary" |
||||
BlueprintIdentifier = "331C8080294A63A400263BE5" |
||||
BuildableName = "RunnerTests.xctest" |
||||
BlueprintName = "RunnerTests" |
||||
ReferencedContainer = "container:Runner.xcodeproj"> |
||||
</BuildableReference> |
||||
</TestableReference> |
||||
</Testables> |
||||
</TestAction> |
||||
<LaunchAction |
||||
buildConfiguration = "Debug" |
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" |
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" |
||||
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> |
||||
</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> |
@ -1,10 +0,0 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<Workspace |
||||
version = "1.0"> |
||||
<FileRef |
||||
location = "group:Runner.xcodeproj"> |
||||
</FileRef> |
||||
<FileRef |
||||
location = "group:Pods/Pods.xcodeproj"> |
||||
</FileRef> |
||||
</Workspace> |
@ -1,8 +0,0 @@ |
||||
<?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>IDEDidComputeMac32BitWarning</key> |
||||
<true/> |
||||
</dict> |
||||
</plist> |
@ -1,8 +0,0 @@ |
||||
<?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>PreviewsEnabled</key> |
||||
<false/> |
||||
</dict> |
||||
</plist> |
@ -1,13 +0,0 @@ |
||||
import UIKit |
||||
import Flutter |
||||
|
||||
@UIApplicationMain |
||||
@objc class AppDelegate: FlutterAppDelegate { |
||||
override func application( |
||||
_ application: UIApplication, |
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? |
||||
) -> Bool { |
||||
GeneratedPluginRegistrant.register(with: self) |
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions) |
||||
} |
||||
} |
@ -1,122 +0,0 @@ |
||||
{ |
||||
"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" |
||||
} |
||||
} |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 295 B |
Before Width: | Height: | Size: 406 B |
Before Width: | Height: | Size: 450 B |
Before Width: | Height: | Size: 282 B |
Before Width: | Height: | Size: 462 B |
Before Width: | Height: | Size: 704 B |
Before Width: | Height: | Size: 406 B |
Before Width: | Height: | Size: 586 B |
Before Width: | Height: | Size: 862 B |
Before Width: | Height: | Size: 862 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 762 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
@ -1,23 +0,0 @@ |
||||
{ |
||||
"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" |
||||
} |
||||
} |
Before Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 68 B |
@ -1,5 +0,0 @@ |
||||
# 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. |
@ -1,37 +0,0 @@ |
||||
<?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> |
@ -1,26 +0,0 @@ |
||||
<?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> |
@ -1,53 +0,0 @@ |
||||
<?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>$(DEVELOPMENT_LANGUAGE)</string> |
||||
<key>CFBundleDisplayName</key> |
||||
<string>Example</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>example</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>CADisableMinimumFrameDurationOnPhone</key> |
||||
<true/> |
||||
<key>UIApplicationSupportsIndirectInputEvents</key> |
||||
<true/> |
||||
<key>NSPhotoLibraryUsageDescription</key> |
||||
<string>The app will use it to pick images</string> |
||||
<key>NSCameraUsageDescription</key> |
||||
<string>The app will use it to capture a images, record videos.</string> |
||||
</dict> |
||||
</plist> |
@ -1 +0,0 @@ |
||||
#import "GeneratedPluginRegistrant.h" |
@ -1,12 +0,0 @@ |
||||
import Flutter |
||||
import UIKit |
||||
import XCTest |
||||
|
||||
class RunnerTests: XCTestCase { |
||||
|
||||
func testExample() { |
||||
// If you add code to the Runner application, consider adding tests here. |
||||
// See https://developer.apple.com/documentation/xctest for more information about using XCTest. |
||||
} |
||||
|
||||
} |
@ -1,42 +0,0 @@ |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_localizations/flutter_localizations.dart'; |
||||
import 'package:flutter_quill/translations.dart'; |
||||
|
||||
import 'pages/home_page.dart'; |
||||
|
||||
void main() { |
||||
WidgetsFlutterBinding.ensureInitialized(); |
||||
runApp(const MyApp()); |
||||
} |
||||
|
||||
class MyApp extends StatelessWidget { |
||||
const MyApp({super.key}); |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return MaterialApp( |
||||
debugShowCheckedModeBanner: false, |
||||
title: 'Quill Demo', |
||||
theme: ThemeData( |
||||
primarySwatch: Colors.blue, |
||||
visualDensity: VisualDensity.adaptivePlatformDensity, |
||||
useMaterial3: true, |
||||
brightness: Brightness.light, |
||||
), |
||||
darkTheme: ThemeData( |
||||
primarySwatch: Colors.blue, |
||||
visualDensity: VisualDensity.adaptivePlatformDensity, |
||||
useMaterial3: true, |
||||
brightness: Brightness.dark, |
||||
), |
||||
localizationsDelegates: const [ |
||||
GlobalMaterialLocalizations.delegate, |
||||
GlobalWidgetsLocalizations.delegate, |
||||
GlobalCupertinoLocalizations.delegate, |
||||
FlutterQuillLocalizations.delegate, |
||||
], |
||||
supportedLocales: FlutterQuillLocalizations.supportedLocales, |
||||
home: const HomePage(), |
||||
); |
||||
} |
||||
} |
@ -1,879 +0,0 @@ |
||||
// ignore_for_file: avoid_redundant_argument_values |
||||
|
||||
import 'dart:async' show Timer; |
||||
import 'dart:convert'; |
||||
import 'dart:io' show File; |
||||
import 'dart:ui'; |
||||
|
||||
import 'package:desktop_drop/desktop_drop.dart'; |
||||
import 'package:file_picker/file_picker.dart'; |
||||
import 'package:flutter/foundation.dart'; |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter/services.dart'; |
||||
import 'package:flutter_quill/extensions.dart'; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; |
||||
import 'package:flutter_quill_extensions/logic/services/image_picker/image_picker.dart'; |
||||
import 'package:flutter_quill_extensions/presentation/embeds/widgets/image.dart'; |
||||
import 'package:image_cropper/image_cropper.dart'; |
||||
import 'package:path/path.dart' as path; |
||||
import 'package:path_provider/path_provider.dart'; |
||||
import 'package:quill_html_converter/quill_html_converter.dart'; |
||||
|
||||
import '../samples/sample_data.dart'; |
||||
import '../samples/sample_data_nomedia.dart'; |
||||
import '../samples/sample_data_testing.dart'; |
||||
import '../widgets/time_stamp_embed_widget.dart'; |
||||
import 'read_only_page.dart'; |
||||
|
||||
enum _SelectionType { |
||||
none, |
||||
word, |
||||
// line, |
||||
} |
||||
|
||||
class HomePage extends StatefulWidget { |
||||
const HomePage({super.key}); |
||||
|
||||
@override |
||||
_HomePageState createState() => _HomePageState(); |
||||
} |
||||
|
||||
class _HomePageState extends State<HomePage> { |
||||
late final QuillController _controller; |
||||
late final Future<void> _loadDocumentFromAssetsFuture; |
||||
final FocusNode _focusNode = FocusNode(); |
||||
Timer? _selectAllTimer; |
||||
_SelectionType _selectionType = _SelectionType.none; |
||||
var _isReadOnly = false; |
||||
|
||||
@override |
||||
void dispose() { |
||||
_selectAllTimer?.cancel(); |
||||
// Dispose the controller to free resources |
||||
_controller.dispose(); |
||||
super.dispose(); |
||||
} |
||||
|
||||
@override |
||||
void initState() { |
||||
super.initState(); |
||||
_loadDocumentFromAssetsFuture = _loadFromAssets(); |
||||
} |
||||
|
||||
Future<void> _loadFromAssets() async { |
||||
try { |
||||
final doc = Document.fromJson(sampleDataTesting); |
||||
_controller = QuillController( |
||||
document: doc, |
||||
selection: const TextSelection.collapsed(offset: 0), |
||||
); |
||||
} catch (error) { |
||||
print(error.toString()); |
||||
final doc = Document() |
||||
..insert(0, 'Error while loading the document: ${error.toString()}'); |
||||
_controller = QuillController( |
||||
document: doc, |
||||
selection: const TextSelection.collapsed(offset: 0), |
||||
); |
||||
} |
||||
} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return FutureBuilder( |
||||
future: _loadDocumentFromAssetsFuture, |
||||
builder: (context, snapshot) { |
||||
if (snapshot.connectionState == ConnectionState.waiting) { |
||||
return const Scaffold( |
||||
body: Center(child: CircularProgressIndicator.adaptive()), |
||||
); |
||||
} |
||||
return Scaffold( |
||||
appBar: AppBar( |
||||
title: const Text( |
||||
'Flutter Quill', |
||||
), |
||||
actions: [ |
||||
IconButton( |
||||
tooltip: 'Print to log', |
||||
onPressed: () { |
||||
print( |
||||
jsonEncode(_controller.document.toDelta().toJson()), |
||||
); |
||||
ScaffoldMessenger.of(context).showSnackBar( |
||||
const SnackBar( |
||||
content: Text( |
||||
'The quill delta json has been printed to the log.', |
||||
), |
||||
), |
||||
); |
||||
}, |
||||
icon: const Icon( |
||||
Icons.print, |
||||
), |
||||
), |
||||
IconButton( |
||||
tooltip: 'Toggle read only', |
||||
onPressed: () { |
||||
setState(() => _isReadOnly = !_isReadOnly); |
||||
}, |
||||
icon: Icon( |
||||
_isReadOnly ? Icons.lock : Icons.edit, |
||||
), |
||||
), |
||||
IconButton( |
||||
onPressed: () { |
||||
_insertTimeStamp( |
||||
_controller, |
||||
DateTime.now().toString(), |
||||
); |
||||
}, |
||||
icon: const Icon(Icons.add_alarm_rounded), |
||||
), |
||||
IconButton( |
||||
onPressed: () => showDialog( |
||||
context: context, |
||||
builder: (context) => AlertDialog( |
||||
content: Text( |
||||
_controller.document.toPlainText( |
||||
[ |
||||
...FlutterQuillEmbeds.editorBuilders(), |
||||
TimeStampEmbedBuilderWidget() |
||||
], |
||||
), |
||||
), |
||||
), |
||||
), |
||||
icon: const Icon(Icons.text_fields_rounded), |
||||
) |
||||
], |
||||
), |
||||
drawer: Drawer( |
||||
child: ListView( |
||||
children: [ |
||||
DrawerHeader( |
||||
child: IconButton( |
||||
tooltip: 'Open document by json delta', |
||||
onPressed: () async { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final navigator = Navigator.of(context); |
||||
try { |
||||
final result = await FilePicker.platform.pickFiles( |
||||
dialogTitle: 'Pick json delta', |
||||
type: FileType.custom, |
||||
allowedExtensions: ['json'], |
||||
allowMultiple: false, |
||||
); |
||||
final file = result?.files.firstOrNull; |
||||
final filePath = file?.path; |
||||
if (file == null || filePath == null) { |
||||
return; |
||||
} |
||||
final jsonString = await XFile(filePath).readAsString(); |
||||
_controller.document = |
||||
Document.fromJson(jsonDecode(jsonString)); |
||||
} catch (e) { |
||||
print( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
); |
||||
scaffoldMessenger.showSnackBar( |
||||
SnackBar( |
||||
content: Text( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
), |
||||
), |
||||
); |
||||
} finally { |
||||
navigator.pop(); |
||||
} |
||||
}, |
||||
icon: const Icon(Icons.file_copy), |
||||
), |
||||
), |
||||
ListTile( |
||||
title: const Text('Load sample data'), |
||||
onTap: () async { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final navigator = Navigator.of(context); |
||||
try { |
||||
_controller.document = Document.fromJson( |
||||
sampleData, |
||||
); |
||||
} catch (e) { |
||||
print( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
); |
||||
scaffoldMessenger.showSnackBar(SnackBar( |
||||
content: Text( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
), |
||||
)); |
||||
} finally { |
||||
navigator.pop(); |
||||
} |
||||
}, |
||||
), |
||||
ListTile( |
||||
title: const Text('Load sample data with no media'), |
||||
onTap: () async { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final navigator = Navigator.of(context); |
||||
try { |
||||
_controller.document = Document.fromJson( |
||||
sampleDataNoMedia, |
||||
); |
||||
} catch (e) { |
||||
print( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
); |
||||
scaffoldMessenger.showSnackBar(SnackBar( |
||||
content: Text( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
), |
||||
)); |
||||
} finally { |
||||
navigator.pop(); |
||||
} |
||||
}, |
||||
), |
||||
ListTile( |
||||
title: const Text('Load testing sample data '), |
||||
onTap: () async { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final navigator = Navigator.of(context); |
||||
try { |
||||
_controller.document = Document.fromJson( |
||||
sampleDataTesting, |
||||
); |
||||
} catch (e) { |
||||
print( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
); |
||||
scaffoldMessenger.showSnackBar(SnackBar( |
||||
content: Text( |
||||
'Error while loading json delta file: ${e.toString()}', |
||||
), |
||||
)); |
||||
} finally { |
||||
navigator.pop(); |
||||
} |
||||
}, |
||||
), |
||||
ListTile( |
||||
title: const Text('Convert to/from HTML'), |
||||
onTap: () async { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final navigator = Navigator.of(context); |
||||
try { |
||||
final html = _controller.document.toDelta().toHtml(); |
||||
_controller.document = |
||||
Document.fromDelta(DeltaHtmlExt.fromHtml(html)); |
||||
} catch (e) { |
||||
scaffoldMessenger.showSnackBar( |
||||
SnackBar( |
||||
content: Text( |
||||
'Error while convert to/from HTML: ${e.toString()}', |
||||
), |
||||
), |
||||
); |
||||
} finally { |
||||
navigator.pop(); |
||||
} |
||||
}, |
||||
), |
||||
_buildMenuBar(context), |
||||
], |
||||
), |
||||
), |
||||
body: _buildWelcomeEditor(context), |
||||
); |
||||
}, |
||||
); |
||||
} |
||||
|
||||
bool _onTripleClickSelection() { |
||||
final controller = _controller; |
||||
|
||||
_selectAllTimer?.cancel(); |
||||
_selectAllTimer = null; |
||||
|
||||
// If you want to select all text after paragraph, uncomment this line |
||||
// if (_selectionType == _SelectionType.line) { |
||||
// final selection = TextSelection( |
||||
// baseOffset: 0, |
||||
// extentOffset: controller.document.length, |
||||
// ); |
||||
|
||||
// controller.updateSelection(selection, ChangeSource.REMOTE); |
||||
|
||||
// _selectionType = _SelectionType.none; |
||||
|
||||
// return true; |
||||
// } |
||||
|
||||
if (controller.selection.isCollapsed) { |
||||
_selectionType = _SelectionType.none; |
||||
} |
||||
|
||||
if (_selectionType == _SelectionType.none) { |
||||
_selectionType = _SelectionType.word; |
||||
_startTripleClickTimer(); |
||||
return false; |
||||
} |
||||
|
||||
if (_selectionType == _SelectionType.word) { |
||||
final child = controller.document.queryChild( |
||||
controller.selection.baseOffset, |
||||
); |
||||
final offset = child.node?.documentOffset ?? 0; |
||||
final length = child.node?.length ?? 0; |
||||
|
||||
final selection = TextSelection( |
||||
baseOffset: offset, |
||||
extentOffset: offset + length, |
||||
); |
||||
|
||||
controller.updateSelection(selection, ChangeSource.remote); |
||||
|
||||
// _selectionType = _SelectionType.line; |
||||
|
||||
_selectionType = _SelectionType.none; |
||||
|
||||
_startTripleClickTimer(); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
void _startTripleClickTimer() { |
||||
_selectAllTimer = Timer(const Duration(milliseconds: 900), () { |
||||
_selectionType = _SelectionType.none; |
||||
}); |
||||
} |
||||
|
||||
OnDragDoneCallback get _onDragDone { |
||||
return (details) { |
||||
final scaffoldMessenger = ScaffoldMessenger.of(context); |
||||
final file = details.files.first; |
||||
final isSupported = |
||||
imageFileExtensions.any((ext) => file.name.endsWith(ext)); |
||||
if (!isSupported) { |
||||
scaffoldMessenger.showSnackBar( |
||||
SnackBar( |
||||
content: Text( |
||||
'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions', |
||||
), |
||||
), |
||||
); |
||||
return; |
||||
} |
||||
_controller.insertImageBlock( |
||||
imageSource: file.path, |
||||
); |
||||
scaffoldMessenger.showSnackBar( |
||||
const SnackBar( |
||||
content: Text('Image is inserted.'), |
||||
), |
||||
); |
||||
}; |
||||
} |
||||
|
||||
QuillEditor get quillEditor { |
||||
if (kIsWeb) { |
||||
return QuillEditor( |
||||
focusNode: _focusNode, |
||||
scrollController: ScrollController(), |
||||
configurations: QuillEditorConfigurations( |
||||
builder: (context, rawEditor) { |
||||
return DropTarget( |
||||
onDragDone: _onDragDone, |
||||
child: rawEditor, |
||||
); |
||||
}, |
||||
placeholder: 'Add content', |
||||
readOnly: false, |
||||
scrollable: true, |
||||
autoFocus: false, |
||||
expands: false, |
||||
padding: EdgeInsets.zero, |
||||
onTapUp: (details, p1) { |
||||
return _onTripleClickSelection(); |
||||
}, |
||||
customStyles: const DefaultStyles( |
||||
h1: DefaultTextBlockStyle( |
||||
TextStyle( |
||||
fontSize: 32, |
||||
height: 1.15, |
||||
fontWeight: FontWeight.w300, |
||||
), |
||||
VerticalSpacing(16, 0), |
||||
VerticalSpacing(0, 0), |
||||
null, |
||||
), |
||||
sizeSmall: TextStyle(fontSize: 9), |
||||
), |
||||
embedBuilders: [ |
||||
...FlutterQuillEmbeds.editorWebBuilders(), |
||||
TimeStampEmbedBuilderWidget() |
||||
], |
||||
), |
||||
); |
||||
} |
||||
return QuillEditor( |
||||
configurations: QuillEditorConfigurations( |
||||
builder: (context, rawEditor) { |
||||
return DropTarget( |
||||
onDragDone: _onDragDone, |
||||
child: rawEditor, |
||||
); |
||||
}, |
||||
placeholder: 'Add content', |
||||
readOnly: _isReadOnly, |
||||
autoFocus: false, |
||||
enableSelectionToolbar: isMobile(supportWeb: false), |
||||
expands: false, |
||||
padding: EdgeInsets.zero, |
||||
onImagePaste: _onImagePaste, |
||||
onTapUp: (details, p1) { |
||||
return _onTripleClickSelection(); |
||||
}, |
||||
customStyles: const DefaultStyles( |
||||
h1: DefaultTextBlockStyle( |
||||
TextStyle( |
||||
fontSize: 32, |
||||
height: 1.15, |
||||
fontWeight: FontWeight.w300, |
||||
), |
||||
VerticalSpacing(16, 0), |
||||
VerticalSpacing(0, 0), |
||||
null, |
||||
), |
||||
sizeSmall: TextStyle(fontSize: 9), |
||||
subscript: TextStyle( |
||||
fontFamily: 'SF-UI-Display', |
||||
fontFeatures: [FontFeature.subscripts()], |
||||
), |
||||
superscript: TextStyle( |
||||
fontFamily: 'SF-UI-Display', |
||||
fontFeatures: [FontFeature.superscripts()], |
||||
), |
||||
), |
||||
embedBuilders: [ |
||||
...FlutterQuillEmbeds.editorBuilders( |
||||
imageEmbedConfigurations: |
||||
const QuillEditorImageEmbedConfigurations(), |
||||
), |
||||
TimeStampEmbedBuilderWidget() |
||||
], |
||||
), |
||||
scrollController: ScrollController(), |
||||
focusNode: _focusNode, |
||||
); |
||||
} |
||||
|
||||
/// When inserting an image |
||||
OnImageInsertCallback get onImageInsert { |
||||
return (image, controller) async { |
||||
final croppedFile = await ImageCropper().cropImage( |
||||
sourcePath: image, |
||||
aspectRatioPresets: [ |
||||
CropAspectRatioPreset.square, |
||||
CropAspectRatioPreset.ratio3x2, |
||||
CropAspectRatioPreset.original, |
||||
CropAspectRatioPreset.ratio4x3, |
||||
CropAspectRatioPreset.ratio16x9 |
||||
], |
||||
uiSettings: [ |
||||
AndroidUiSettings( |
||||
toolbarTitle: 'Cropper', |
||||
toolbarColor: Colors.deepOrange, |
||||
toolbarWidgetColor: Colors.white, |
||||
initAspectRatio: CropAspectRatioPreset.original, |
||||
lockAspectRatio: false, |
||||
), |
||||
IOSUiSettings( |
||||
title: 'Cropper', |
||||
), |
||||
WebUiSettings( |
||||
context: context, |
||||
), |
||||
], |
||||
); |
||||
final newImage = croppedFile?.path; |
||||
if (newImage == null) { |
||||
return; |
||||
} |
||||
if (isWeb()) { |
||||
controller.insertImageBlock(imageSource: newImage); |
||||
return; |
||||
} |
||||
final newSavedImage = await _onImagePickCallback(File(newImage)); |
||||
controller.insertImageBlock(imageSource: newSavedImage); |
||||
}; |
||||
} |
||||
|
||||
QuillToolbar get quillToolbar { |
||||
final customButtons = [ |
||||
QuillToolbarCustomButtonOptions( |
||||
icon: const Icon(Icons.ac_unit), |
||||
onPressed: () { |
||||
debugPrint('snowflake1'); |
||||
}, |
||||
), |
||||
QuillToolbarCustomButtonOptions( |
||||
icon: const Icon(Icons.ac_unit), |
||||
onPressed: () { |
||||
debugPrint('snowflake2'); |
||||
}, |
||||
), |
||||
QuillToolbarCustomButtonOptions( |
||||
icon: const Icon(Icons.ac_unit), |
||||
onPressed: () { |
||||
debugPrint('snowflake3'); |
||||
}, |
||||
), |
||||
]; |
||||
if (kIsWeb) { |
||||
return QuillToolbar( |
||||
configurations: QuillToolbarConfigurations( |
||||
customButtons: customButtons, |
||||
embedButtons: FlutterQuillEmbeds.toolbarButtons( |
||||
cameraButtonOptions: const QuillToolbarCameraButtonOptions(), |
||||
imageButtonOptions: QuillToolbarImageButtonOptions( |
||||
imageButtonConfigurations: QuillToolbarImageConfigurations( |
||||
onImageInsertedCallback: (image) async {}, |
||||
onImageInsertCallback: onImageInsert, |
||||
), |
||||
), |
||||
), |
||||
buttonOptions: QuillToolbarButtonOptions( |
||||
base: QuillToolbarBaseButtonOptions( |
||||
afterButtonPressed: _focusNode.requestFocus, |
||||
), |
||||
), |
||||
), |
||||
); |
||||
} |
||||
if (isDesktop(supportWeb: false)) { |
||||
return QuillToolbar( |
||||
configurations: QuillToolbarConfigurations( |
||||
customButtons: customButtons, |
||||
embedButtons: FlutterQuillEmbeds.toolbarButtons( |
||||
cameraButtonOptions: const QuillToolbarCameraButtonOptions(), |
||||
imageButtonOptions: QuillToolbarImageButtonOptions( |
||||
imageButtonConfigurations: QuillToolbarImageConfigurations( |
||||
onImageInsertedCallback: (image) async { |
||||
ScaffoldMessenger.of(context).showSnackBar( |
||||
const SnackBar( |
||||
content: Text('Image inserted'), |
||||
), |
||||
); |
||||
}, |
||||
), |
||||
), |
||||
), |
||||
showAlignmentButtons: true, |
||||
buttonOptions: QuillToolbarButtonOptions( |
||||
base: QuillToolbarBaseButtonOptions( |
||||
afterButtonPressed: _focusNode.requestFocus, |
||||
), |
||||
), |
||||
), |
||||
); |
||||
} |
||||
return QuillToolbar( |
||||
configurations: QuillToolbarConfigurations( |
||||
customButtons: customButtons, |
||||
embedButtons: FlutterQuillEmbeds.toolbarButtons( |
||||
cameraButtonOptions: const QuillToolbarCameraButtonOptions(), |
||||
videoButtonOptions: QuillToolbarVideoButtonOptions( |
||||
videoConfigurations: QuillToolbarVideoConfigurations( |
||||
onVideoInsertedCallback: (video) => |
||||
_onVideoPickCallback(File(video)), |
||||
), |
||||
), |
||||
imageButtonOptions: QuillToolbarImageButtonOptions( |
||||
imageButtonConfigurations: QuillToolbarImageConfigurations( |
||||
onImageInsertCallback: onImageInsert, |
||||
onImageInsertedCallback: (image) async { |
||||
ScaffoldMessenger.of(context).showSnackBar( |
||||
const SnackBar( |
||||
content: Text('Image inserted'), |
||||
), |
||||
); |
||||
}, |
||||
), |
||||
// provide a callback to enable picking images from device. |
||||
// if omit, "image" button only allows adding images from url. |
||||
// same goes for videos. |
||||
// onImagePickCallback: _onImagePickCallback, |
||||
// uncomment to provide a custom "pick from" dialog. |
||||
// mediaPickSettingSelector: _selectMediaPickSetting, |
||||
// uncomment to provide a custom "pick from" dialog. |
||||
// cameraPickSettingSelector: _selectCameraPickSetting, |
||||
), |
||||
// videoButtonOptions: QuillToolbarVideoButtonOptions( |
||||
// onVideoPickCallback: _onVideoPickCallback, |
||||
// ), |
||||
), |
||||
showAlignmentButtons: true, |
||||
buttonOptions: QuillToolbarButtonOptions( |
||||
base: QuillToolbarBaseButtonOptions( |
||||
afterButtonPressed: _focusNode.requestFocus, |
||||
), |
||||
), |
||||
), |
||||
// afterButtonPressed: _focusNode.requestFocus, |
||||
); |
||||
} |
||||
|
||||
Widget _buildWelcomeEditor(BuildContext context) { |
||||
// BUG in web!! should not releated to this pull request |
||||
/// |
||||
///══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═════════════════════ |
||||
///══════════════════════════════════════ |
||||
// The following bool object was thrown building MediaQuery |
||||
//(MediaQueryData(size: Size(769.0, 1205.0), |
||||
// devicePixelRatio: 1.0, textScaleFactor: 1.0, platformBrightness: |
||||
//Brightness.dark, padding: |
||||
// EdgeInsets.zero, viewPadding: EdgeInsets.zero, viewInsets: |
||||
// EdgeInsets.zero, |
||||
// systemGestureInsets: |
||||
// EdgeInsets.zero, alwaysUse24HourFormat: false, accessibleNavigation: |
||||
// false, |
||||
// highContrast: false, |
||||
// disableAnimations: false, invertColors: false, boldText: false, |
||||
//navigationMode: traditional, |
||||
// gestureSettings: DeviceGestureSettings(touchSlop: null), displayFeatures: |
||||
// [] |
||||
// )): |
||||
// false |
||||
// The relevant error-causing widget was: |
||||
// SafeArea |
||||
/// |
||||
/// |
||||
return SafeArea( |
||||
child: QuillProvider( |
||||
configurations: QuillConfigurations( |
||||
controller: _controller, |
||||
sharedConfigurations: QuillSharedConfigurations( |
||||
animationConfigurations: QuillAnimationConfigurations.enableAll(), |
||||
locale: const Locale( |
||||
'de', |
||||
), // won't take affect since we defined FlutterQuillLocalizations.delegate |
||||
), |
||||
), |
||||
child: Column( |
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
||||
children: <Widget>[ |
||||
Expanded( |
||||
flex: 15, |
||||
child: Container( |
||||
padding: const EdgeInsets.only(left: 16, right: 16), |
||||
child: quillEditor, |
||||
), |
||||
), |
||||
if (!_isReadOnly) |
||||
kIsWeb |
||||
? Expanded( |
||||
child: Container( |
||||
padding: const EdgeInsets.symmetric( |
||||
vertical: 16, horizontal: 8), |
||||
child: quillToolbar, |
||||
)) |
||||
: Container( |
||||
child: quillToolbar, |
||||
) |
||||
], |
||||
), |
||||
), |
||||
); |
||||
} |
||||
|
||||
// Future<String?> _openFileSystemPickerForDesktop(BuildContext context) |
||||
// async { |
||||
// return await FilesystemPicker.open( |
||||
// context: context, |
||||
// rootDirectory: await getApplicationDocumentsDirectory(), |
||||
// fsType: FilesystemType.file, |
||||
// fileTileSelectMode: FileTileSelectMode.wholeTile, |
||||
// ); |
||||
// } |
||||
|
||||
// Renders the image picked by imagePicker from local file storage |
||||
// You can also upload the picked image to any server (eg : AWS s3 |
||||
// or Firebase) and then return the uploaded image URL. |
||||
Future<String> _onImagePickCallback(File file) async { |
||||
// Copies the picked file from temporary cache to applications directory |
||||
final appDocDir = await getApplicationDocumentsDirectory(); |
||||
// final copiedFile = |
||||
// await file.copy('${appDocDir.path}/${path.basename(file.path)}'); |
||||
final copiedFile = await file.copy(path.join( |
||||
appDocDir.path, |
||||
'${DateTime.now().toIso8601String()}${path.extension(file.path)}', |
||||
)); |
||||
return copiedFile.path.toString(); |
||||
} |
||||
|
||||
// Future<String?> _webImagePickImpl( |
||||
// OnImagePickCallback onImagePickCallback) async { |
||||
// final result = await FilePicker.platform.pickFiles(); |
||||
// if (result == null) { |
||||
// return null; |
||||
// } |
||||
|
||||
// // Take first, because we don't allow picking multiple files. |
||||
// final fileName = result.files.first.name; |
||||
// final file = File(fileName); |
||||
|
||||
// return onImagePickCallback(file); |
||||
// } |
||||
|
||||
// Renders the video picked by imagePicker from local file storage |
||||
// You can also upload the picked video to any server (eg : AWS s3 |
||||
// or Firebase) and then return the uploaded video URL. |
||||
Future<String> _onVideoPickCallback(File file) async { |
||||
// Copies the picked file from temporary cache to applications directory |
||||
final appDocDir = await getApplicationDocumentsDirectory(); |
||||
final copiedFile = |
||||
await file.copy('${appDocDir.path}/${path.basename(file.path)}'); |
||||
return copiedFile.path.toString(); |
||||
} |
||||
|
||||
// // ignore: unused_element |
||||
// Future<MediaPickSetting?> _selectMediaPickSetting(BuildContext context) => |
||||
// showDialog<MediaPickSetting>( |
||||
// context: context, |
||||
// builder: (ctx) => AlertDialog( |
||||
// contentPadding: EdgeInsets.zero, |
||||
// content: Column( |
||||
// mainAxisSize: MainAxisSize.min, |
||||
// children: [ |
||||
// TextButton.icon( |
||||
// icon: const Icon(Icons.collections), |
||||
// label: const Text('Gallery'), |
||||
// onPressed: () => Navigator.pop(ctx, |
||||
// MediaPickSetting.gallery), |
||||
// ), |
||||
// TextButton.icon( |
||||
// icon: const Icon(Icons.link), |
||||
// label: const Text('Link'), |
||||
// onPressed: () => Navigator.pop(ctx, MediaPickSetting.link), |
||||
// ) |
||||
// ], |
||||
// ), |
||||
// ), |
||||
// ); |
||||
|
||||
// // ignore: unused_element |
||||
// Future<MediaPickSetting?> _selectCameraPickSetting(BuildContext context) => |
||||
// showDialog<MediaPickSetting>( |
||||
// context: context, |
||||
// builder: (ctx) => AlertDialog( |
||||
// contentPadding: EdgeInsets.zero, |
||||
// content: Column( |
||||
// mainAxisSize: MainAxisSize.min, |
||||
// children: [ |
||||
// TextButton.icon( |
||||
// icon: const Icon(Icons.camera), |
||||
// label: const Text('Capture a photo'), |
||||
// onPressed: () => Navigator.pop(ctx, MediaPickSetting.camera), |
||||
// ), |
||||
// TextButton.icon( |
||||
// icon: const Icon(Icons.video_call), |
||||
// label: const Text('Capture a video'), |
||||
// onPressed: () => Navigator.pop(ctx, MediaPickSetting.video), |
||||
// ) |
||||
// ], |
||||
// ), |
||||
// ), |
||||
// ); |
||||
|
||||
Widget _buildMenuBar(BuildContext context) { |
||||
final size = MediaQuery.sizeOf(context); |
||||
return Column( |
||||
mainAxisAlignment: MainAxisAlignment.center, |
||||
children: [ |
||||
Divider( |
||||
thickness: 2, |
||||
indent: size.width * 0.1, |
||||
endIndent: size.width * 0.1, |
||||
), |
||||
ListTile( |
||||
title: const Center( |
||||
child: Text( |
||||
'Read only demo', |
||||
)), |
||||
dense: true, |
||||
visualDensity: VisualDensity.compact, |
||||
onTap: _openReadOnlyPage, |
||||
), |
||||
Divider( |
||||
thickness: 2, |
||||
indent: size.width * 0.1, |
||||
endIndent: size.width * 0.1, |
||||
), |
||||
], |
||||
); |
||||
} |
||||
|
||||
void _openReadOnlyPage() { |
||||
Navigator.pop(super.context); |
||||
Navigator.push( |
||||
super.context, |
||||
MaterialPageRoute( |
||||
builder: (context) => const ReadOnlyPage(), |
||||
), |
||||
); |
||||
} |
||||
|
||||
Future<String> _onImagePaste(Uint8List imageBytes) async { |
||||
// Saves the image to applications directory |
||||
final appDocDir = await getApplicationDocumentsDirectory(); |
||||
final file = await File( |
||||
'${appDocDir.path}/${path.basename('${DateTime.now().millisecondsSinceEpoch}.png')}', |
||||
).writeAsBytes(imageBytes, flush: true); |
||||
return file.path.toString(); |
||||
} |
||||
|
||||
static void _insertTimeStamp(QuillController controller, String string) { |
||||
controller.document.insert(controller.selection.extentOffset, '\n'); |
||||
controller.updateSelection( |
||||
TextSelection.collapsed( |
||||
offset: controller.selection.extentOffset + 1, |
||||
), |
||||
ChangeSource.local, |
||||
); |
||||
|
||||
controller.document.insert( |
||||
controller.selection.extentOffset, |
||||
TimeStampEmbed(string), |
||||
); |
||||
|
||||
controller.updateSelection( |
||||
TextSelection.collapsed( |
||||
offset: controller.selection.extentOffset + 1, |
||||
), |
||||
ChangeSource.local, |
||||
); |
||||
|
||||
controller.document.insert(controller.selection.extentOffset, ' '); |
||||
controller.updateSelection( |
||||
TextSelection.collapsed( |
||||
offset: controller.selection.extentOffset + 1, |
||||
), |
||||
ChangeSource.local, |
||||
); |
||||
|
||||
controller.document.insert(controller.selection.extentOffset, '\n'); |
||||
controller.updateSelection( |
||||
TextSelection.collapsed( |
||||
offset: controller.selection.extentOffset + 1, |
||||
), |
||||
ChangeSource.local, |
||||
); |
||||
} |
||||
} |
@ -1,81 +0,0 @@ |
||||
// ignore_for_file: avoid_redundant_argument_values |
||||
|
||||
import 'package:flutter/foundation.dart'; |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/extensions.dart'; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'; |
||||
|
||||
import '../widgets/demo_scaffold.dart'; |
||||
|
||||
class ReadOnlyPage extends StatefulWidget { |
||||
const ReadOnlyPage({super.key}); |
||||
|
||||
@override |
||||
_ReadOnlyPageState createState() => _ReadOnlyPageState(); |
||||
} |
||||
|
||||
class _ReadOnlyPageState extends State<ReadOnlyPage> { |
||||
final FocusNode _focusNode = FocusNode(); |
||||
|
||||
bool _edit = false; |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return DemoScaffold( |
||||
documentFilename: isDesktop(supportWeb: false) |
||||
? 'assets/sample_data_nomedia.json' |
||||
: 'sample_data_nomedia.json', |
||||
builder: _buildContent, |
||||
showToolbar: _edit == true, |
||||
floatingActionButton: FloatingActionButton.extended( |
||||
label: Text(_edit == true ? 'Done' : 'Edit'), |
||||
onPressed: _toggleEdit, |
||||
icon: Icon(_edit == true ? Icons.check : Icons.edit), |
||||
), |
||||
); |
||||
} |
||||
|
||||
Widget _buildContent(BuildContext context, QuillController? controller) { |
||||
var quillEditor = QuillEditor( |
||||
configurations: QuillEditorConfigurations( |
||||
expands: false, |
||||
padding: EdgeInsets.zero, |
||||
embedBuilders: kIsWeb |
||||
? FlutterQuillEmbeds.editorWebBuilders() |
||||
: FlutterQuillEmbeds.editorBuilders(), |
||||
scrollable: true, |
||||
autoFocus: true, |
||||
), |
||||
scrollController: ScrollController(), |
||||
focusNode: _focusNode, |
||||
// readOnly: !_edit, |
||||
); |
||||
if (kIsWeb) { |
||||
quillEditor = QuillEditor( |
||||
configurations: QuillEditorConfigurations( |
||||
autoFocus: true, |
||||
expands: false, |
||||
padding: EdgeInsets.zero, |
||||
embedBuilders: FlutterQuillEmbeds.editorWebBuilders(), |
||||
scrollable: true, |
||||
), |
||||
scrollController: ScrollController(), |
||||
focusNode: _focusNode, |
||||
); |
||||
} |
||||
return Container( |
||||
decoration: BoxDecoration( |
||||
border: Border.all(color: Colors.grey.shade200), |
||||
), |
||||
padding: const EdgeInsets.all(8), |
||||
child: quillEditor, |
||||
); |
||||
} |
||||
|
||||
void _toggleEdit() { |
||||
setState(() { |
||||
_edit = !_edit; |
||||
}); |
||||
} |
||||
} |
@ -1,13 +0,0 @@ |
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_quill/flutter_quill.dart'; |
||||
|
||||
class TestingHomePage extends StatelessWidget { |
||||
const TestingHomePage({super.key}); |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return const Scaffold( |
||||
appBar: QuillToolbar(), |
||||
); |
||||
} |
||||
} |
@ -1,293 +0,0 @@ |
||||
const sampleData = [ |
||||
{ |
||||
'insert': {'image': 'assets/images/1.png'}, |
||||
'attributes': { |
||||
'width': '100', |
||||
'height': '100', |
||||
'style': 'width:500px; height:350px;' |
||||
} |
||||
}, |
||||
{'insert': 'Flutter Quill'}, |
||||
{ |
||||
'attributes': {'header': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'insert': { |
||||
'video': |
||||
'https://www.youtube.com/watch?v=V4hgdKhIqtc&list=PLbhaS_83B97s78HsDTtplRTEhcFsqSqIK&index=1' |
||||
} |
||||
}, |
||||
{ |
||||
'insert': { |
||||
'video': |
||||
'https://user-images.githubusercontent.com/122956/126238875-22e42501-ad41-4266-b1d6-3f89b5e3b79b.mp4' |
||||
} |
||||
}, |
||||
{'insert': '\nRich text editor for Flutter'}, |
||||
{ |
||||
'attributes': {'header': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Quill component for Flutter'}, |
||||
{ |
||||
'attributes': {'header': 3}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'attributes': {'link': 'https://bulletjournal.us/home/index.html'}, |
||||
'insert': 'Bullet Journal' |
||||
}, |
||||
{ |
||||
'insert': |
||||
':\nTrack personal and group journals (ToDo, Note, Ledger) from multiple views with timely reminders' |
||||
}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'insert': |
||||
'Share your tasks and notes with teammates, and see changes as they happen in real-time, across all devices' |
||||
}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Check out what you and your teammates are working on each day'}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\nSplitting bills with friends can never be easier.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Start creating a group and invite your friends to join.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Create a BuJo of Ledger type to see expense or balance summary.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'insert': |
||||
'\nAttach one or multiple labels to tasks, notes or transactions. Later you can track them just using the label(s).' |
||||
}, |
||||
{ |
||||
'attributes': {'blockquote': true}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': "\nvar BuJo = 'Bullet' + 'Journal'"}, |
||||
{ |
||||
'attributes': {'code-block': true}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\nStart tracking in your browser'}, |
||||
{ |
||||
'attributes': {'indent': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Stop the timer on your phone'}, |
||||
{ |
||||
'attributes': {'indent': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'All your time entries are synced'}, |
||||
{ |
||||
'attributes': {'indent': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'between the phone apps'}, |
||||
{ |
||||
'attributes': {'indent': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'and the website.'}, |
||||
{ |
||||
'attributes': {'indent': 3}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\n'}, |
||||
{'insert': '\nCenter Align'}, |
||||
{ |
||||
'attributes': {'align': 'center'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Right Align'}, |
||||
{ |
||||
'attributes': {'align': 'right'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Justify Align'}, |
||||
{ |
||||
'attributes': {'align': 'justify'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Have trouble finding things? '}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Just type in the search bar'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'and easily find contents'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'across projects or folders.'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'It matches text in your note or task.'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Enable reminders so that you will get notified by'}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'email'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'message on your phone'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'popup on the web site'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Create a BuJo serving as project or folder'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Organize your'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'tasks'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'notes'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'transactions'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'under BuJo '}, |
||||
{ |
||||
'attributes': {'indent': 3, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'See them in Calendar'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'or hierarchical view'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'this is a check list'}, |
||||
{ |
||||
'attributes': {'list': 'checked'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'this is a uncheck list'}, |
||||
{ |
||||
'attributes': {'list': 'unchecked'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Font '}, |
||||
{ |
||||
'attributes': {'font': 'sans-serif'}, |
||||
'insert': 'Sans Serif' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'font': 'serif'}, |
||||
'insert': 'Serif' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'font': 'monospace'}, |
||||
'insert': 'Monospace' |
||||
}, |
||||
{'insert': ' Size '}, |
||||
{ |
||||
'attributes': {'size': 'small'}, |
||||
'insert': 'Small' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': 'large'}, |
||||
'insert': 'Large' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': 'huge'}, |
||||
'insert': 'Huge' |
||||
}, |
||||
{ |
||||
'attributes': {'size': '15.0'}, |
||||
'insert': 'font size 15' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': '35'}, |
||||
'insert': 'font size 35' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': '20'}, |
||||
'insert': 'font size 20' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'built_in'}, |
||||
'insert': ' diff' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'operator'}, |
||||
'insert': '-match' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'literal'}, |
||||
'insert': '-patch' |
||||
}, |
||||
{ |
||||
'insert': { |
||||
'image': |
||||
'https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png' |
||||
}, |
||||
'attributes': { |
||||
'width': '230', |
||||
'style': 'display: block; margin: auto; width: 500px;' |
||||
} |
||||
}, |
||||
{'insert': '\n'} |
||||
]; |
@ -1,270 +0,0 @@ |
||||
const sampleDataNoMedia = [ |
||||
{'insert': 'Flutter Quill'}, |
||||
{ |
||||
'attributes': {'header': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\nRich text editor for Flutter'}, |
||||
{ |
||||
'attributes': {'header': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Quill component for Flutter'}, |
||||
{ |
||||
'attributes': {'color': 'rgba(0, 0, 0, 0.847)'}, |
||||
'insert': ' and ' |
||||
}, |
||||
{ |
||||
'attributes': {'link': 'https://bulletjournal.us/home/index.html'}, |
||||
'insert': 'Bullet Journal' |
||||
}, |
||||
{ |
||||
'insert': |
||||
':\nTrack personal and group journals (ToDo, Note, Ledger) from multiple views with timely reminders' |
||||
}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'insert': |
||||
'Share your tasks and notes with teammates, and see changes as they happen in real-time, across all devices' |
||||
}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Check out what you and your teammates are working on each day'}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\nSplitting bills with friends can never be easier.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Start creating a group and invite your friends to join.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Create a BuJo of Ledger type to see expense or balance summary.'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{ |
||||
'insert': |
||||
'\nAttach one or multiple labels to tasks, notes or transactions. Later you can track them just using the label(s).' |
||||
}, |
||||
{ |
||||
'attributes': {'blockquote': true}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': "\nvar BuJo = 'Bullet' + 'Journal'"}, |
||||
{ |
||||
'attributes': {'code-block': true}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\nStart tracking in your browser'}, |
||||
{ |
||||
'attributes': {'indent': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Stop the timer on your phone'}, |
||||
{ |
||||
'attributes': {'indent': 1}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'All your time entries are synced'}, |
||||
{ |
||||
'attributes': {'indent': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'between the phone apps'}, |
||||
{ |
||||
'attributes': {'indent': 2}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'and the website.'}, |
||||
{ |
||||
'attributes': {'indent': 3}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': '\n'}, |
||||
{'insert': '\nCenter Align'}, |
||||
{ |
||||
'attributes': {'align': 'center'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Right Align'}, |
||||
{ |
||||
'attributes': {'align': 'right'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Justify Align'}, |
||||
{ |
||||
'attributes': {'align': 'justify'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Have trouble finding things? '}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Just type in the search bar'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'and easily find contents'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'across projects or folders.'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'It matches text in your note or task.'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Enable reminders so that you will get notified by'}, |
||||
{ |
||||
'attributes': {'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'email'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'message on your phone'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'popup on the web site'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'ordered'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Create a BuJo serving as project or folder'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Organize your'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'tasks'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'notes'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'transactions'}, |
||||
{ |
||||
'attributes': {'indent': 2, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'under BuJo '}, |
||||
{ |
||||
'attributes': {'indent': 3, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'See them in Calendar'}, |
||||
{ |
||||
'attributes': {'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'or hierarchical view'}, |
||||
{ |
||||
'attributes': {'indent': 1, 'list': 'bullet'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'this is a check list'}, |
||||
{ |
||||
'attributes': {'list': 'checked'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'this is a uncheck list'}, |
||||
{ |
||||
'attributes': {'list': 'unchecked'}, |
||||
'insert': '\n' |
||||
}, |
||||
{'insert': 'Font '}, |
||||
{ |
||||
'attributes': {'font': 'sans-serif'}, |
||||
'insert': 'Sans Serif' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'font': 'serif'}, |
||||
'insert': 'Serif' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'font': 'monospace'}, |
||||
'insert': 'Monospace' |
||||
}, |
||||
{'insert': ' Size '}, |
||||
{ |
||||
'attributes': {'size': 'small'}, |
||||
'insert': 'Small' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': 'large'}, |
||||
'insert': 'Large' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': 'huge'}, |
||||
'insert': 'Huge' |
||||
}, |
||||
{ |
||||
'attributes': {'size': '15.0'}, |
||||
'insert': 'font size 15' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': '35'}, |
||||
'insert': 'font size 35' |
||||
}, |
||||
{'insert': ' '}, |
||||
{ |
||||
'attributes': {'size': '20'}, |
||||
'insert': 'font size 20' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'built_in'}, |
||||
'insert': ' diff' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'operator'}, |
||||
'insert': '-match' |
||||
}, |
||||
{ |
||||
'attributes': {'token': 'literal'}, |
||||
'insert': '-patch' |
||||
}, |
||||
{ |
||||
'insert': { |
||||
'image': |
||||
'https://user-images.githubusercontent.com/122956/72955931-ccc07900-3d52-11ea-89b1-d468a6e2aa2b.png' |
||||
}, |
||||
'attributes': {'width': '230', 'style': 'display: block; margin: auto;'} |
||||
}, |
||||
{'insert': '\n'} |
||||
]; |
@ -1,3 +0,0 @@ |
||||
// class PlatformViewRegistry { |
||||
// static void registerViewFactory(String viewId, dynamic cb) {} |
||||
// } |