Quill provider && fix macOS example runner

pull/1444/head
Ahmed Hnewa 2 years ago
parent 7c5a12b140
commit 356c833d32
No known key found for this signature in database
GPG Key ID: C488CC70BBCEF0D1
  1. 3
      example/android/app/build.gradle
  2. 15
      example/lib/pages/home_page.dart
  3. 3
      example/lib/pages/read_only_page.dart
  4. 7
      example/lib/widgets/demo_scaffold.dart
  5. 2
      example/macos/Podfile
  6. 56
      example/macos/Runner.xcodeproj/project.pbxproj
  7. 2
      example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  8. 10
      example/pubspec.yaml
  9. 6
      flutter_quill_extensions/pubspec.yaml
  10. 2
      lib/flutter_quill.dart
  11. 12
      lib/src/core/quill_configurations.dart
  12. 21
      lib/src/utils/extensions/build_context.dart
  13. 6
      lib/src/widgets/toolbar.dart
  14. 35
      lib/src/widgets/utils/quill_provider.dart
  15. 20
      test/bug_fix_test.dart

@ -47,7 +47,7 @@ android {
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
multiDexEnabled true // Multidex is not required for api level 21
} }
buildTypes { buildTypes {
@ -64,5 +64,4 @@ flutter {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:multidex:1.0.3'
} }

@ -249,7 +249,7 @@ class _HomePageState extends State<HomePage> {
]); ]);
} }
var toolbar = QuillToolbar.basic( var toolbar = QuillToolbar.basic(
controller: _controller!, context: context,
embedButtons: FlutterQuillEmbeds.buttons( embedButtons: FlutterQuillEmbeds.buttons(
// provide a callback to enable picking images from device. // provide a callback to enable picking images from device.
// if omit, "image" button only allows adding images from url. // if omit, "image" button only allows adding images from url.
@ -266,7 +266,7 @@ class _HomePageState extends State<HomePage> {
); );
if (kIsWeb) { if (kIsWeb) {
toolbar = QuillToolbar.basic( toolbar = QuillToolbar.basic(
controller: _controller!, context: context,
embedButtons: FlutterQuillEmbeds.buttons( embedButtons: FlutterQuillEmbeds.buttons(
onImagePickCallback: _onImagePickCallback, onImagePickCallback: _onImagePickCallback,
webImagePickImpl: _webImagePickImpl, webImagePickImpl: _webImagePickImpl,
@ -277,7 +277,7 @@ class _HomePageState extends State<HomePage> {
} }
if (_isDesktop()) { if (_isDesktop()) {
toolbar = QuillToolbar.basic( toolbar = QuillToolbar.basic(
controller: _controller!, context: context,
embedButtons: FlutterQuillEmbeds.buttons( embedButtons: FlutterQuillEmbeds.buttons(
onImagePickCallback: _onImagePickCallback, onImagePickCallback: _onImagePickCallback,
filePickImpl: openFileSystemPickerForDesktop, filePickImpl: openFileSystemPickerForDesktop,
@ -288,6 +288,14 @@ class _HomePageState extends State<HomePage> {
} }
return SafeArea( return SafeArea(
child: QuillProvider(
configurations: QuillConfigurations(
controller: _controller ??
(throw ArgumentError.checkNotNull(
_controller,
'Quill controller',
)),
),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
@ -309,6 +317,7 @@ class _HomePageState extends State<HomePage> {
: Container(child: toolbar) : Container(child: toolbar)
], ],
), ),
),
); );
} }

@ -28,7 +28,8 @@ class _ReadOnlyPageState extends State<ReadOnlyPage> {
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
label: Text(_edit == true ? 'Done' : 'Edit'), label: Text(_edit == true ? 'Done' : 'Edit'),
onPressed: _toggleEdit, onPressed: _toggleEdit,
icon: Icon(_edit == true ? Icons.check : Icons.edit)), icon: Icon(_edit == true ? Icons.check : Icons.edit),
),
); );
} }

@ -91,14 +91,15 @@ class _DemoScaffoldState extends State<DemoScaffold> {
} }
final actions = widget.actions ?? <Widget>[]; final actions = widget.actions ?? <Widget>[];
var toolbar = QuillToolbar.basic( var toolbar = QuillToolbar.basic(
controller: _controller!, context: context,
embedButtons: FlutterQuillEmbeds.buttons(), embedButtons: FlutterQuillEmbeds.buttons(),
); );
if (_isDesktop()) { if (_isDesktop()) {
toolbar = QuillToolbar.basic( toolbar = QuillToolbar.basic(
controller: _controller!, context: context,
embedButtons: FlutterQuillEmbeds.buttons( embedButtons: FlutterQuillEmbeds.buttons(
filePickImpl: openFileSystemPickerForDesktop), filePickImpl: openFileSystemPickerForDesktop,
),
); );
} }
return Scaffold( return Scaffold(

@ -1,4 +1,4 @@
platform :osx, '10.11' platform :osx, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency. # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true' ENV['COCOAPODS_DISABLE_STATS'] = 'true'

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 51; objectVersion = 54;
objects = { objects = {
/* Begin PBXAggregateTarget section */ /* Begin PBXAggregateTarget section */
@ -21,12 +21,12 @@
/* End PBXAggregateTarget section */ /* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
07D884DE6AB8033C3F60B238 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48A88899E2BC5FD7AFD2B040 /* Pods_Runner.framework */; };
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
7C7D9700842BA0E01048B7B5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93FCB7C0C7A612A19EB2D2C2 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -53,7 +53,7 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
0C1FD22CA47E09B485C5D2F0 /* 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>"; }; 17BD0969A552CE47C17FC221 /* 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>"; };
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
33CC10ED2044A3C60003C045 /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = app.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10ED2044A3C60003C045 /* app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = app.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -68,11 +68,11 @@
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; }; 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
4B8510D07EAD5FFD466A09A7 /* 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>"; }; 3DB40E993F068140F6DEEA8F /* 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>"; };
48A88899E2BC5FD7AFD2B040 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
676737A1C184536E1D9D90A1 /* 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>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
93FCB7C0C7A612A19EB2D2C2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
F44289D50723316BB0B4ADA1 /* 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -80,7 +80,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
7C7D9700842BA0E01048B7B5 /* Pods_Runner.framework in Frameworks */, 07D884DE6AB8033C3F60B238 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -104,8 +104,8 @@
33FAB671232836740065AC1E /* Runner */, 33FAB671232836740065AC1E /* Runner */,
33CEB47122A05771004F2AC0 /* Flutter */, 33CEB47122A05771004F2AC0 /* Flutter */,
33CC10EE2044A3C60003C045 /* Products */, 33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */, E0CAA5D4D3AFCAEB94FF2464 /* Pods */,
D4C5240DF6823DEC9AB0AD3D /* Pods */, C2525C9EE4B6956CB985C5A2 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -152,23 +152,23 @@
path = Runner; path = Runner;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D4C5240DF6823DEC9AB0AD3D /* Pods */ = { C2525C9EE4B6956CB985C5A2 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0C1FD22CA47E09B485C5D2F0 /* Pods-Runner.debug.xcconfig */, 48A88899E2BC5FD7AFD2B040 /* Pods_Runner.framework */,
4B8510D07EAD5FFD466A09A7 /* Pods-Runner.release.xcconfig */,
F44289D50723316BB0B4ADA1 /* Pods-Runner.profile.xcconfig */,
); );
name = Pods; name = Frameworks;
path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
D73912EC22F37F3D000D13A0 /* Frameworks */ = { E0CAA5D4D3AFCAEB94FF2464 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
93FCB7C0C7A612A19EB2D2C2 /* Pods_Runner.framework */, 3DB40E993F068140F6DEEA8F /* Pods-Runner.debug.xcconfig */,
676737A1C184536E1D9D90A1 /* Pods-Runner.release.xcconfig */,
17BD0969A552CE47C17FC221 /* Pods-Runner.profile.xcconfig */,
); );
name = Frameworks; name = Pods;
path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
/* End PBXGroup section */ /* End PBXGroup section */
@ -178,13 +178,13 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
ECE07D1381B49CCA8A8E0C5F /* [CP] Check Pods Manifest.lock */, 8E0B73589C7156B8D6C458C1 /* [CP] Check Pods Manifest.lock */,
33CC10E92044A3C60003C045 /* Sources */, 33CC10E92044A3C60003C045 /* Sources */,
33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EA2044A3C60003C045 /* Frameworks */,
33CC10EB2044A3C60003C045 /* Resources */, 33CC10EB2044A3C60003C045 /* Resources */,
33CC110E2044A8840003C045 /* Bundle Framework */, 33CC110E2044A8840003C045 /* Bundle Framework */,
3399D490228B24CF009A79C7 /* ShellScript */, 3399D490228B24CF009A79C7 /* ShellScript */,
678C02007C3A278E6325D529 /* [CP] Embed Pods Frameworks */, 64BF2FA23C00365B5E3F66C0 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@ -203,7 +203,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0920; LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 0930; LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
33CC10EC2044A3C60003C045 = { 33CC10EC2044A3C60003C045 = {
@ -256,6 +256,7 @@
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
3399D490228B24CF009A79C7 /* ShellScript */ = { 3399D490228B24CF009A79C7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
@ -291,7 +292,7 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
}; };
678C02007C3A278E6325D529 /* [CP] Embed Pods Frameworks */ = { 64BF2FA23C00365B5E3F66C0 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -308,7 +309,7 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
ECE07D1381B49CCA8A8E0C5F /* [CP] Check Pods Manifest.lock */ = { 8E0B73589C7156B8D6C458C1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -404,7 +405,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx; SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
@ -426,6 +427,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.0;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
}; };
@ -483,7 +485,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx; SDKROOT = macosx;
@ -530,7 +532,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx; SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
@ -552,6 +554,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.0;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -572,6 +575,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.0;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
}; };

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1000" LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

@ -23,14 +23,14 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
universal_html: ^2.0.8 universal_html: ^2.2.4
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.4 cupertino_icons: ^1.0.6
path_provider: ^2.0.9 path_provider: ^2.1.1
filesystem_picker: ^3.1.0 filesystem_picker: ^4.0.0
file_picker: ^5.2.2 file_picker: ^6.0.0
flutter_quill: flutter_quill:
path: ../ path: ../
flutter_quill_extensions: flutter_quill_extensions:

@ -12,10 +12,10 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
flutter_quill: ^7.4.15 # flutter_quill: ^7.4.16
# In case you are working on changes for both libraries, # In case you are working on changes for both libraries,
# flutter_quill: flutter_quill:
# path: ~/development/playground/framework_based/flutter/flutter-quill path: /Users/ahmedhnewa/development/playground/framework_based/flutter/flutter-quill
http: ^1.1.0 http: ^1.1.0
image_picker: ">=1.0.4" image_picker: ">=1.0.4"

@ -1,5 +1,6 @@
library flutter_quill; library flutter_quill;
export 'src/core/quill_configurations.dart';
export 'src/models/documents/attribute.dart'; export 'src/models/documents/attribute.dart';
export 'src/models/documents/document.dart'; export 'src/models/documents/document.dart';
export 'src/models/documents/nodes/block.dart'; export 'src/models/documents/nodes/block.dart';
@ -27,3 +28,4 @@ export 'src/widgets/link.dart' show LinkActionPickerDelegate, LinkMenuAction;
export 'src/widgets/style_widgets/style_widgets.dart'; export 'src/widgets/style_widgets/style_widgets.dart';
export 'src/widgets/toolbar.dart'; export 'src/widgets/toolbar.dart';
export 'src/widgets/toolbar/enum.dart'; export 'src/widgets/toolbar/enum.dart';
export 'src/widgets/utils/quill_provider.dart';

@ -0,0 +1,12 @@
import 'package:flutter/foundation.dart' show immutable;
import '../../flutter_quill.dart';
@immutable
class QuillConfigurations {
const QuillConfigurations({
required this.controller,
});
final QuillController controller;
}

@ -0,0 +1,21 @@
import 'package:flutter/widgets.dart' show BuildContext;
import '../../../flutter_quill.dart';
extension BuildContextExt on BuildContext {
QuillProvider get requireQuillProvider {
return QuillProvider.ofNotNull(this);
}
QuillProvider? get quillProvider {
return QuillProvider.of(this);
}
QuillController? get quilController {
return quillProvider?.configurations.controller;
}
QuillController get requireQuillController {
return requireQuillProvider.configurations.controller;
}
}

@ -1,12 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:i18n_extension/i18n_widget.dart'; import 'package:i18n_extension/i18n_widget.dart';
import '../../flutter_quill.dart';
import '../models/documents/attribute.dart'; import '../models/documents/attribute.dart';
import '../models/structs/link_dialog_action.dart'; import '../models/structs/link_dialog_action.dart';
import '../models/themes/quill_custom_button.dart'; import '../models/themes/quill_custom_button.dart';
import '../models/themes/quill_dialog_theme.dart'; import '../models/themes/quill_dialog_theme.dart';
import '../models/themes/quill_icon_theme.dart'; import '../models/themes/quill_icon_theme.dart';
import '../translations/toolbar.i18n.dart'; import '../translations/toolbar.i18n.dart';
import '../utils/extensions/build_context.dart';
import 'controller.dart'; import 'controller.dart';
import 'embeds.dart'; import 'embeds.dart';
import 'toolbar/arrow_indicated_button_list.dart'; import 'toolbar/arrow_indicated_button_list.dart';
@ -71,7 +73,7 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
}) : super(key: key); }) : super(key: key);
factory QuillToolbar.basic({ factory QuillToolbar.basic({
required QuillController controller, required BuildContext context,
Axis axis = Axis.horizontal, Axis axis = Axis.horizontal,
double toolbarIconSize = kDefaultIconSize, double toolbarIconSize = kDefaultIconSize,
double toolbarSectionSpacing = kToolbarSectionSpacing, double toolbarSectionSpacing = kToolbarSectionSpacing,
@ -248,6 +250,8 @@ class QuillToolbar extends StatelessWidget implements PreferredSizeWidget {
ToolbarButtons.search: 'Search'.i18n, ToolbarButtons.search: 'Search'.i18n,
}; };
final controller = context.requireQuillController;
return QuillToolbar( return QuillToolbar(
key: key, key: key,
axis: axis, axis: axis,

@ -0,0 +1,35 @@
import 'package:flutter/foundation.dart' show debugPrint, kDebugMode;
import 'package:flutter/widgets.dart' show InheritedWidget, BuildContext;
import '../../core/quill_configurations.dart';
class QuillProvider extends InheritedWidget {
const QuillProvider({
required this.configurations,
required super.child,
});
final QuillConfigurations configurations;
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
throw false;
}
static QuillProvider? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<QuillProvider>();
}
static QuillProvider ofNotNull(BuildContext context) {
final provider = of(context);
if (provider == null) {
if (kDebugMode) {
debugPrint(
'The quill provider must be provided in the widget tree.',
);
}
throw ArgumentError.checkNotNull(provider, 'QuillProvider');
}
return provider;
}
}

@ -12,12 +12,24 @@ void main() {
(tester) async { (tester) async {
const tooltip = 'custom button'; const tooltip = 'custom button';
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(
home: QuillToolbar.basic( MaterialApp(
showRedo: false, home: QuillProvider(
configurations: QuillConfigurations(
controller: QuillController.basic(), controller: QuillController.basic(),
),
child: Builder(
builder: (context) {
return QuillToolbar.basic(
context: context,
showRedo: false,
customButtons: [const QuillCustomButton(tooltip: tooltip)], customButtons: [const QuillCustomButton(tooltip: tooltip)],
))); );
},
),
),
),
);
final builtinFinder = find.descendant( final builtinFinder = find.descendant(
of: find.byType(HistoryButton), of: find.byType(HistoryButton),

Loading…
Cancel
Save