Step 6 of remaking the example

pull/1530/head
Ellet 1 year ago
parent e03501b944
commit 7f1b4bd699
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 3
      .github/workflows/main.yml
  2. 2
      .gitignore
  3. 1
      example/android/app/src/main/AndroidManifest.xml
  4. 7
      example/lib/main.dart
  5. 8
      example/lib/presentation/home/widgets/home_screen.dart
  6. 94
      example/lib/presentation/quill/quill_editor.dart
  7. 179
      example/lib/presentation/quill/quill_screen.dart
  8. 236
      example/lib/presentation/quill/quill_toolbar.dart
  9. 13
      example/lib/presentation/quill/samples/quill_images_sample.dart
  10. 19
      example/lib/presentation/quill/samples/quill_videos_sample.dart
  11. 41
      example/lib/presentation/settings/cubit/settings_cubit.freezed.dart
  12. 2
      example/lib/presentation/settings/cubit/settings_cubit.g.dart
  13. 1
      example/lib/presentation/settings/cubit/settings_state.dart
  14. 16
      example/lib/presentation/settings/widgets/settings_screen.dart
  15. 2
      lib/src/models/documents/nodes/embeddable.dart
  16. 42
      old_example/.gitignore
  17. 45
      old_example/.metadata
  18. 11
      old_example/README.md
  19. 37
      old_example/analysis_options.yaml
  20. 13
      old_example/android/.gitignore
  21. 64
      old_example/android/app/build.gradle
  22. 7
      old_example/android/app/src/debug/AndroidManifest.xml
  23. 57
      old_example/android/app/src/main/AndroidManifest.xml
  24. 5
      old_example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
  25. 12
      old_example/android/app/src/main/res/drawable-v21/launch_background.xml
  26. 12
      old_example/android/app/src/main/res/drawable/launch_background.xml
  27. BIN
      old_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  28. BIN
      old_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  29. BIN
      old_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  30. BIN
      old_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  31. BIN
      old_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  32. 18
      old_example/android/app/src/main/res/values-night/styles.xml
  33. 18
      old_example/android/app/src/main/res/values/styles.xml
  34. 7
      old_example/android/app/src/profile/AndroidManifest.xml
  35. 74
      old_example/android/build.gradle
  36. 6
      old_example/android/gradle.properties
  37. 5
      old_example/android/gradle/wrapper/gradle-wrapper.properties
  38. 20
      old_example/android/settings.gradle
  39. BIN
      old_example/assets/fonts/IbarraRealNova-Regular.ttf
  40. BIN
      old_example/assets/fonts/MonoSpace.ttf
  41. BIN
      old_example/assets/fonts/Nunito-Regular.ttf
  42. BIN
      old_example/assets/fonts/Pacifico-Regular.ttf
  43. BIN
      old_example/assets/fonts/RobotoMono-Regular.ttf
  44. BIN
      old_example/assets/fonts/SF-Pro-Display-Regular.otf
  45. BIN
      old_example/assets/fonts/SansSerif.ttf
  46. BIN
      old_example/assets/fonts/Serif.ttf
  47. BIN
      old_example/assets/fonts/SquarePeg-Regular.ttf
  48. BIN
      old_example/assets/images/1.png
  49. BIN
      old_example/assets/images/2.png
  50. BIN
      old_example/assets/images/3.png
  51. BIN
      old_example/assets/images/4.png
  52. 34
      old_example/ios/.gitignore
  53. 26
      old_example/ios/Flutter/AppFrameworkInfo.plist
  54. 2
      old_example/ios/Flutter/Debug.xcconfig
  55. 2
      old_example/ios/Flutter/Release.xcconfig
  56. 44
      old_example/ios/Podfile
  57. 144
      old_example/ios/Podfile.lock
  58. 722
      old_example/ios/Runner.xcodeproj/project.pbxproj
  59. 7
      old_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  60. 8
      old_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  61. 8
      old_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  62. 98
      old_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  63. 10
      old_example/ios/Runner.xcworkspace/contents.xcworkspacedata
  64. 8
      old_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  65. 8
      old_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  66. 13
      old_example/ios/Runner/AppDelegate.swift
  67. 122
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  68. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  69. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  70. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  71. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  72. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  73. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  74. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  75. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  76. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  77. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  78. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  79. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  80. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  81. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  82. BIN
      old_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  83. 23
      old_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  84. BIN
      old_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  85. BIN
      old_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  86. BIN
      old_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  87. 5
      old_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  88. 37
      old_example/ios/Runner/Base.lproj/LaunchScreen.storyboard
  89. 26
      old_example/ios/Runner/Base.lproj/Main.storyboard
  90. 53
      old_example/ios/Runner/Info.plist
  91. 1
      old_example/ios/Runner/Runner-Bridging-Header.h
  92. 12
      old_example/ios/RunnerTests/RunnerTests.swift
  93. 42
      old_example/lib/main.dart
  94. 879
      old_example/lib/pages/home_page.dart
  95. 81
      old_example/lib/pages/read_only_page.dart
  96. 13
      old_example/lib/pages/testing_home_page.dart
  97. 293
      old_example/lib/samples/sample_data.dart
  98. 270
      old_example/lib/samples/sample_data_nomedia.dart
  99. 83
      old_example/lib/samples/sample_data_testing.dart
  100. 3
      old_example/lib/universal_ui/fake_ui.dart
  101. Some files were not shown because too many files have changed in this diff Show More

@ -31,9 +31,6 @@ jobs:
- name: Install quill_html_converter dependencies
run: flutter pub get -C packages/quill_html_converter
- name: Install old_example dependencies
run: flutter pub get -C old_example
- name: Run flutter analysis
run: flutter analyze

2
.gitignore vendored

@ -79,3 +79,5 @@ pubspec.lock
# For local development
pubspec_overrides.yaml
old_example

@ -40,6 +40,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- For `image_cropper` plugin -->
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"

@ -18,6 +18,7 @@ import 'presentation/quill/quill_screen.dart';
import 'presentation/quill/samples/quill_default_sample.dart';
import 'presentation/quill/samples/quill_images_sample.dart';
import 'presentation/quill/samples/quill_text_sample.dart';
import 'presentation/quill/samples/quill_videos_sample.dart';
import 'presentation/settings/cubit/settings_cubit.dart';
import 'presentation/settings/widgets/settings_screen.dart';
@ -101,8 +102,10 @@ class MyApp extends StatelessWidget {
document: Document.fromJson(quillImagesSample),
),
),
DefaultScreen.videosSample => throw UnimplementedError(
'Not implemented for now',
DefaultScreen.videosSample => QuillScreen(
args: QuillScreenArgs(
document: Document.fromJson(quillVideosSample),
),
),
DefaultScreen.textSample => QuillScreen(
args: QuillScreenArgs(

@ -10,6 +10,7 @@ import '../../quill/quill_screen.dart';
import '../../quill/samples/quill_default_sample.dart';
import '../../quill/samples/quill_images_sample.dart';
import '../../quill/samples/quill_text_sample.dart';
import '../../quill/samples/quill_videos_sample.dart';
import '../../settings/widgets/settings_screen.dart';
import 'example_item.dart';
@ -100,7 +101,12 @@ class HomeScreen extends StatelessWidget {
),
text: 'If you want to see how the editor work with videos, '
'see any samples or you are working on it',
onPressed: () {},
onPressed: () => Navigator.of(context).pushNamed(
QuillScreen.routeName,
arguments: QuillScreenArgs(
document: Document.fromJson(quillVideosSample),
),
),
),
HomeScreenExampleItem(
title: 'Text',

@ -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,
);
},
),
);
}
}

@ -1,21 +1,17 @@
import 'dart:io';
import 'dart:convert' show jsonEncode;
import 'package:cached_network_image/cached_network_image.dart';
import 'package:desktop_drop/desktop_drop.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 'package:flutter_quill_extensions/presentation/embeds/widgets/image.dart'
show getImageProviderByImageSource, imageFileExtensions;
import 'package:image_cropper/image_cropper.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:flutter_quill_extensions/flutter_quill_extensions.dart'
show FlutterQuillEmbeds, QuillSharedExtensionsConfigurations;
import 'package:quill_html_converter/quill_html_converter.dart';
import 'package:share_plus/share_plus.dart' show Share;
import '../extensions/scaffold_messenger.dart';
import '../shared/widgets/home_screen_button.dart';
import 'quill_editor.dart';
import 'quill_toolbar.dart';
@immutable
class QuillScreenArgs {
@ -40,6 +36,8 @@ class QuillScreen extends StatefulWidget {
class _QuillScreenState extends State<QuillScreen> {
final _controller = QuillController.basic();
final _editorFocusNode = FocusNode();
final _editorScrollController = ScrollController();
var _isReadOnly = false;
@override
@ -48,62 +46,12 @@ class _QuillScreenState extends State<QuillScreen> {
_controller.document = widget.args.document;
}
Future<void> onImageInsertWithCropping(
String image, QuillController 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 saveImage(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(File(image));
controller.insertImageBlock(imageSource: newSavedImage);
}
/// Copies the picked file from temporary cache to applications directory
Future<String> saveImage(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
void dispose() {
_controller.dispose();
_editorFocusNode.dispose();
_editorScrollController.dispose();
super.dispose();
}
@override
@ -137,6 +85,18 @@ class _QuillScreenState extends State<QuillScreen> {
},
icon: const Icon(Icons.share),
),
IconButton(
tooltip: 'Print to log',
onPressed: () {
print(
jsonEncode(_controller.document.toDelta().toJson()),
);
ScaffoldMessenger.of(context).showText(
'The quill delta json has been printed to the log.',
);
},
icon: const Icon(Icons.print),
),
const HomeScreenButton(),
],
),
@ -155,95 +115,16 @@ class _QuillScreenState extends State<QuillScreen> {
),
child: Column(
children: [
if (!_isReadOnly)
QuillToolbar(
configurations: QuillToolbarConfigurations(
embedButtons: FlutterQuillEmbeds.toolbarButtons(
imageButtonOptions: QuillToolbarImageButtonOptions(
imageButtonConfigurations:
QuillToolbarImageConfigurations(
onImageInsertCallback: isAndroid(supportWeb: false) ||
isIOS(supportWeb: false) ||
isWeb()
? onImageInsertWithCropping
: onImageInsert,
),
),
),
),
),
if (!_isReadOnly) const MyQuillToolbar(),
Builder(
builder: (context) {
return Expanded(
child: QuillEditor.basic(
child: MyQuillEditor(
configurations: QuillEditorConfigurations(
scrollable: true,
readOnly: _isReadOnly,
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((ext) => file.name.endsWith(ext));
if (!isSupported) {
scaffoldMessenger.showText(
'Only images are supported right now: ${file.mimeType}, ${file.name}, ${file.path}, $imageFileExtensions',
);
return;
}
_controller.insertImageBlock(
imageSource: file.path,
);
scaffoldMessenger.showText('Image is inserted.');
},
child: rawEditor,
);
},
),
scrollController: _editorScrollController,
focusNode: _editorFocusNode,
),
);
},

@ -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,
),
),
),
),
);
},
);
}
}

@ -69,17 +69,4 @@ final quillImagesSample = [
'The source of the above image is also image base 64 but this time it start with `data:image/png;base64,`'
},
{'insert': '\n'},
{'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'}
];

@ -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'},
];

@ -22,6 +22,7 @@ SettingsState _$SettingsStateFromJson(Map<String, dynamic> json) {
mixin _$SettingsState {
ThemeMode get themeMode => throw _privateConstructorUsedError;
DefaultScreen get defaultScreen => throw _privateConstructorUsedError;
bool get useCustomQuillToolbar => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
@ -35,7 +36,10 @@ abstract class $SettingsStateCopyWith<$Res> {
SettingsState value, $Res Function(SettingsState) then) =
_$SettingsStateCopyWithImpl<$Res, SettingsState>;
@useResult
$Res call({ThemeMode themeMode, DefaultScreen defaultScreen});
$Res call(
{ThemeMode themeMode,
DefaultScreen defaultScreen,
bool useCustomQuillToolbar});
}
/// @nodoc
@ -53,6 +57,7 @@ class _$SettingsStateCopyWithImpl<$Res, $Val extends SettingsState>
$Res call({
Object? themeMode = null,
Object? defaultScreen = null,
Object? useCustomQuillToolbar = null,
}) {
return _then(_value.copyWith(
themeMode: null == themeMode
@ -63,6 +68,10 @@ class _$SettingsStateCopyWithImpl<$Res, $Val extends SettingsState>
? _value.defaultScreen
: defaultScreen // ignore: cast_nullable_to_non_nullable
as DefaultScreen,
useCustomQuillToolbar: null == useCustomQuillToolbar
? _value.useCustomQuillToolbar
: useCustomQuillToolbar // ignore: cast_nullable_to_non_nullable
as bool,
) as $Val);
}
}
@ -75,7 +84,10 @@ abstract class _$$SettingsStateImplCopyWith<$Res>
__$$SettingsStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({ThemeMode themeMode, DefaultScreen defaultScreen});
$Res call(
{ThemeMode themeMode,
DefaultScreen defaultScreen,
bool useCustomQuillToolbar});
}
/// @nodoc
@ -91,6 +103,7 @@ class __$$SettingsStateImplCopyWithImpl<$Res>
$Res call({
Object? themeMode = null,
Object? defaultScreen = null,
Object? useCustomQuillToolbar = null,
}) {
return _then(_$SettingsStateImpl(
themeMode: null == themeMode
@ -101,6 +114,10 @@ class __$$SettingsStateImplCopyWithImpl<$Res>
? _value.defaultScreen
: defaultScreen // ignore: cast_nullable_to_non_nullable
as DefaultScreen,
useCustomQuillToolbar: null == useCustomQuillToolbar
? _value.useCustomQuillToolbar
: useCustomQuillToolbar // ignore: cast_nullable_to_non_nullable
as bool,
));
}
}
@ -110,7 +127,8 @@ class __$$SettingsStateImplCopyWithImpl<$Res>
class _$SettingsStateImpl implements _SettingsState {
const _$SettingsStateImpl(
{this.themeMode = ThemeMode.system,
this.defaultScreen = DefaultScreen.home});
this.defaultScreen = DefaultScreen.home,
this.useCustomQuillToolbar = false});
factory _$SettingsStateImpl.fromJson(Map<String, dynamic> json) =>
_$$SettingsStateImplFromJson(json);
@ -121,10 +139,13 @@ class _$SettingsStateImpl implements _SettingsState {
@override
@JsonKey()
final DefaultScreen defaultScreen;
@override
@JsonKey()
final bool useCustomQuillToolbar;
@override
String toString() {
return 'SettingsState(themeMode: $themeMode, defaultScreen: $defaultScreen)';
return 'SettingsState(themeMode: $themeMode, defaultScreen: $defaultScreen, useCustomQuillToolbar: $useCustomQuillToolbar)';
}
@override
@ -135,12 +156,15 @@ class _$SettingsStateImpl implements _SettingsState {
(identical(other.themeMode, themeMode) ||
other.themeMode == themeMode) &&
(identical(other.defaultScreen, defaultScreen) ||
other.defaultScreen == defaultScreen));
other.defaultScreen == defaultScreen) &&
(identical(other.useCustomQuillToolbar, useCustomQuillToolbar) ||
other.useCustomQuillToolbar == useCustomQuillToolbar));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType, themeMode, defaultScreen);
int get hashCode =>
Object.hash(runtimeType, themeMode, defaultScreen, useCustomQuillToolbar);
@JsonKey(ignore: true)
@override
@ -159,7 +183,8 @@ class _$SettingsStateImpl implements _SettingsState {
abstract class _SettingsState implements SettingsState {
const factory _SettingsState(
{final ThemeMode themeMode,
final DefaultScreen defaultScreen}) = _$SettingsStateImpl;
final DefaultScreen defaultScreen,
final bool useCustomQuillToolbar}) = _$SettingsStateImpl;
factory _SettingsState.fromJson(Map<String, dynamic> json) =
_$SettingsStateImpl.fromJson;
@ -169,6 +194,8 @@ abstract class _SettingsState implements SettingsState {
@override
DefaultScreen get defaultScreen;
@override
bool get useCustomQuillToolbar;
@override
@JsonKey(ignore: true)
_$$SettingsStateImplCopyWith<_$SettingsStateImpl> get copyWith =>
throw _privateConstructorUsedError;

@ -13,12 +13,14 @@ _$SettingsStateImpl _$$SettingsStateImplFromJson(Map<String, dynamic> json) =>
defaultScreen:
$enumDecodeNullable(_$DefaultScreenEnumMap, json['defaultScreen']) ??
DefaultScreen.home,
useCustomQuillToolbar: json['useCustomQuillToolbar'] as bool? ?? false,
);
Map<String, dynamic> _$$SettingsStateImplToJson(_$SettingsStateImpl instance) =>
<String, dynamic>{
'themeMode': _$ThemeModeEnumMap[instance.themeMode]!,
'defaultScreen': _$DefaultScreenEnumMap[instance.defaultScreen]!,
'useCustomQuillToolbar': instance.useCustomQuillToolbar,
};
const _$ThemeModeEnumMap = {

@ -15,6 +15,7 @@ class SettingsState with _$SettingsState {
const factory SettingsState({
@Default(ThemeMode.system) ThemeMode themeMode,
@Default(DefaultScreen.home) DefaultScreen defaultScreen,
@Default(false) bool useCustomQuillToolbar,
}) = _SettingsState;
factory SettingsState.fromJson(Map<String, Object?> json) =>
_$SettingsStateFromJson(json);

@ -97,6 +97,22 @@ class SettingsScreen extends StatelessWidget {
}
},
),
CheckboxListTile.adaptive(
value: state.useCustomQuillToolbar,
onChanged: (value) {
final useCustomToolbarNewValue = value ?? false;
context.read<SettingsCubit>().updateSettings(
state.copyWith(
useCustomQuillToolbar: useCustomToolbarNewValue,
),
);
},
title: const Text('Use custom Quill toolbar'),
subtitle: const Text(
'By default we will default QuillToolbar, but you can decide if you the built-in or the custom one',
),
secondary: const Icon(Icons.dashboard_customize),
),
],
);
},

@ -1,4 +1,4 @@
import 'dart:convert';
import 'dart:convert' show jsonDecode, jsonEncode;
/// An object which can be embedded into a Quill document.
///

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

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"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

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"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

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"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

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'}
];

File diff suppressed because one or more lines are too long

@ -1,3 +0,0 @@
// class PlatformViewRegistry {
// static void registerViewFactory(String viewId, dynamic cb) {}
// }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save