@ -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) {} |
|
||||||
// } |
|