|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
Merge master into dev (#258)
* Update issue templates
* Updating checkbox to handle tap (#186)
* updating checkbox to handle tap
* updating checkbox to handle long press and using UniqueKey() to avoid weird side effects
* removed useless doc
Co-authored-by: Kevin Despoulains <kevin.despoulains@scriptandgo.com>
* Simple viewer (#187)
* 2021-04-25
* 2021-04-26
* Fix simple viewer compilation error
* Upgrade version - checkbox supports tapping
* 171: support for non-scrollable text editor (#188)
Co-authored-by: Gyuri Majercsik <gyuri@fluttech.com>
* custom rules & optionally auto add newline for image embeds (#205)
* Adding missing overrides to make package work with Flutter 2.2.0 (#226)
* Improve SOC of raw editor (#227)
Improve separation of concerns for RawEditor by moving the code
for the text input client to a separate class, furthermore add
more comments.
* Upgrade version
* Improve SOC of raw editor (#228)
Improve separation of concerns for `RawEditor` by moving the code
for the keyboard to a separate class, furthermore add more comments.
The PR does not change the functionality of the code.
* Improve further SOC of raw editor
This improves separation of concerns for the RawEditor by moving
the code for the text selection delegate to a separate class,
furthermore add more comments.
The PR does not change the functionality of the code.
* Hide implementation files (#233)
* Fixes for flutter web (#234)
* Fix for Attribute object comparison
* Fix for "Unexpected null value" error on web
Clipboard is now supported on web, via a permission request through the browser
Co-authored-by: George Johnson <george@indiespring.com>
* Dispose ValueNotifier of cursor controller
* Remove getter for final operator
A getter for a final variable makes no sense, because the variable
cannot be reassigned. It is better to remove the unnecessary getter
and make the variable public.
* Add comments to cursor class
* Remove null exception when a disposed controller is set
* Disallow lines longer than 80 characters
* Don't create a lambda when a tear-off will do
* Move ResponsiveWidgets to example folder
This widget has nothing to do with the library and is only used in
the example, so it is moved to the example.
* Fix null exception
* Remove exception when widget is not mounted
* Fix exception when rect is not a number
* Fix paste (#236)
closes #235.
* Fix exception
* Add const types for image and divider embeds
This allows to reference the type.
* Fix relative path
* Add new logo
* Fix buttons which ignore toolbariconsize
Closes #189.
* Upgrade to 1.3.1
* Fix incorrect double to int cast, and guard against optional parent (#239)
* use ceil instead of floor to make sure won't cause overflow
* Fix example project Podfile (#241)
* Show arrow indicator on toolbar (#245)
* Add color parameter to Toolbar and ImageButton
In addition, change these widgets to stateless widgets, since these
widgets do not have a state and thus stateful is superfluous.
* Fix paste bug
* Remove extraneous toolbar dividers in certain configuration
Closes #193.
* Upgrade version to 1.3.2
* Format code
* Bump file_picker to 3.0.2+2
With version 3.0.2 `name` of the file_picker library becomes
non-nullable, so a warning was issued for users who had already
used version 3.0.2, as we still assumed that `name` is nullable.
Increasing the version and removing the exclamation mark removes
the warning.
* Fix a bug that Embed could be together with Text (#249)
* Fix #242 (#254)
* Upgrade to 1.3.3
* Format code
* bugfix:The return type 'bool' isn't a 'KeyEventResult'
Co-authored-by: Xin Yao <singerdmx@gmail.com>
Co-authored-by: kevinDespoulains <46108869+kevinDespoulains@users.noreply.github.com>
Co-authored-by: Kevin Despoulains <kevin.despoulains@scriptandgo.com>
Co-authored-by: em6m6e <50019687+em6m6e@users.noreply.github.com>
Co-authored-by: Gyuri Majercsik <majercsik.gyuri@gmail.com>
Co-authored-by: Gyuri Majercsik <gyuri@fluttech.com>
Co-authored-by: hyouuu <hyouuu@gmail.com>
Co-authored-by: Till Friebe <friebetill@gmail.com>
Co-authored-by: George <george.a.johnson@btopenworld.com>
Co-authored-by: George Johnson <george@indiespring.com>
Co-authored-by: Ben Chung <1330575+yzxben@users.noreply.github.com>
Co-authored-by: lucasbstn <64323294+lucasbstn@users.noreply.github.com>
4 years ago
|
|
|
import 'package:flutter_quill/flutter_quill.dart' hide Text;
|
|
|
|
|
|
|
|
typedef DemoContentBuilder = Widget Function(
|
|
|
|
BuildContext context, QuillController? controller);
|
|
|
|
|
|
|
|
// Common scaffold for all examples.
|
|
|
|
class DemoScaffold extends StatefulWidget {
|
|
|
|
const DemoScaffold({
|
|
|
|
required this.documentFilename,
|
|
|
|
required this.builder,
|
|
|
|
this.actions,
|
|
|
|
this.showToolbar = true,
|
|
|
|
this.floatingActionButton,
|
|
|
|
Key? key,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
/// Filename of the document to load into the editor.
|
|
|
|
final String documentFilename;
|
|
|
|
final DemoContentBuilder builder;
|
|
|
|
final List<Widget>? actions;
|
|
|
|
final Widget? floatingActionButton;
|
|
|
|
final bool showToolbar;
|
|
|
|
|
|
|
|
@override
|
|
|
|
_DemoScaffoldState createState() => _DemoScaffoldState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _DemoScaffoldState extends State<DemoScaffold> {
|
|
|
|
final _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
|
|
QuillController? _controller;
|
|
|
|
|
|
|
|
bool _loading = false;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void didChangeDependencies() {
|
|
|
|
super.didChangeDependencies();
|
|
|
|
if (_controller == null && !_loading) {
|
|
|
|
_loading = true;
|
|
|
|
_loadFromAssets();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
_controller?.dispose();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _loadFromAssets() async {
|
|
|
|
try {
|
|
|
|
final result =
|
|
|
|
await rootBundle.loadString('assets/${widget.documentFilename}');
|
|
|
|
final doc = Document.fromJson(jsonDecode(result));
|
|
|
|
setState(() {
|
|
|
|
_controller = QuillController(
|
|
|
|
document: doc, selection: const TextSelection.collapsed(offset: 0));
|
|
|
|
_loading = false;
|
|
|
|
});
|
|
|
|
} catch (error) {
|
|
|
|
final doc = Document()..insert(0, 'Empty asset');
|
|
|
|
setState(() {
|
|
|
|
_controller = QuillController(
|
|
|
|
document: doc, selection: const TextSelection.collapsed(offset: 0));
|
|
|
|
_loading = false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final actions = widget.actions ?? <Widget>[];
|
|
|
|
return Scaffold(
|
|
|
|
key: _scaffoldKey,
|
|
|
|
appBar: AppBar(
|
|
|
|
elevation: 0,
|
|
|
|
backgroundColor: Theme.of(context).canvasColor,
|
|
|
|
centerTitle: false,
|
|
|
|
titleSpacing: 0,
|
|
|
|
leading: IconButton(
|
|
|
|
icon: Icon(
|
|
|
|
Icons.chevron_left,
|
|
|
|
color: Colors.grey.shade800,
|
|
|
|
size: 18,
|
|
|
|
),
|
|
|
|
onPressed: () => Navigator.pop(context),
|
|
|
|
),
|
|
|
|
title: _loading || widget.showToolbar == false
|
|
|
|
? null
|
|
|
|
: QuillToolbar.basic(controller: _controller!),
|
|
|
|
actions: actions,
|
|
|
|
),
|
|
|
|
floatingActionButton: widget.floatingActionButton,
|
|
|
|
body: _loading
|
|
|
|
? const Center(child: Text('Loading...'))
|
|
|
|
: widget.builder(context, _controller),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|