parent
02db2adb7d
commit
7f798e8e50
3 changed files with 194 additions and 0 deletions
@ -0,0 +1,57 @@ |
|||||||
|
import 'package:app/widgets/demo_scaffold.dart'; |
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter_quill/widgets/controller.dart'; |
||||||
|
import 'package:flutter_quill/widgets/editor.dart'; |
||||||
|
|
||||||
|
class ReadOnlyPage extends StatefulWidget { |
||||||
|
@override |
||||||
|
_ReadOnlyPageState createState() => _ReadOnlyPageState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _ReadOnlyPageState extends State<ReadOnlyPage> { |
||||||
|
final FocusNode _focusNode = FocusNode(); |
||||||
|
|
||||||
|
bool _edit = false; |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return DemoScaffold( |
||||||
|
documentFilename: 'sample_data.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) { |
||||||
|
return Padding( |
||||||
|
padding: const EdgeInsets.all(8.0), |
||||||
|
child: Container( |
||||||
|
decoration: BoxDecoration( |
||||||
|
color: Colors.white, |
||||||
|
border: Border.all(color: Colors.grey.shade200), |
||||||
|
), |
||||||
|
child: QuillEditor( |
||||||
|
controller: controller, |
||||||
|
scrollController: ScrollController(), |
||||||
|
scrollable: true, |
||||||
|
focusNode: _focusNode, |
||||||
|
autoFocus: true, |
||||||
|
readOnly: !_edit, |
||||||
|
enableInteractiveSelection: true, |
||||||
|
expands: false, |
||||||
|
padding: EdgeInsets.zero, |
||||||
|
), |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
void _toggleEdit() { |
||||||
|
setState(() { |
||||||
|
_edit = !_edit; |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,107 @@ |
|||||||
|
import 'dart:convert'; |
||||||
|
|
||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:flutter/services.dart'; |
||||||
|
import 'package:flutter_quill/models/documents/document.dart'; |
||||||
|
import 'package:flutter_quill/widgets/controller.dart'; |
||||||
|
import 'package:flutter_quill/widgets/toolbar.dart'; |
||||||
|
|
||||||
|
|
||||||
|
typedef DemoContentBuilder = Widget Function( |
||||||
|
BuildContext context, QuillController controller); |
||||||
|
|
||||||
|
// Common scaffold for all examples. |
||||||
|
class DemoScaffold extends StatefulWidget { |
||||||
|
/// 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; |
||||||
|
|
||||||
|
const DemoScaffold({ |
||||||
|
Key key, |
||||||
|
@required this.documentFilename, |
||||||
|
@required this.builder, |
||||||
|
this.actions, |
||||||
|
this.showToolbar = true, |
||||||
|
this.floatingActionButton, |
||||||
|
}) : super(key: key); |
||||||
|
|
||||||
|
@override |
||||||
|
_DemoScaffoldState createState() => _DemoScaffoldState(); |
||||||
|
} |
||||||
|
|
||||||
|
class _DemoScaffoldState extends State<DemoScaffold> { |
||||||
|
final _scaffoldKey = GlobalKey<ScaffoldState>(); |
||||||
|
QuillController _controller; |
||||||
|
|
||||||
|
bool _loading = false; |
||||||
|
bool _canSave = 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: TextSelection.collapsed(offset: 0)); |
||||||
|
_loading = false; |
||||||
|
}); |
||||||
|
} catch (error) { |
||||||
|
final doc = Document()..insert(0, 'Empty asset'); |
||||||
|
setState(() { |
||||||
|
_controller = QuillController( |
||||||
|
document: doc, selection: 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 |
||||||
|
? Center(child: Text('Loading...')) |
||||||
|
: widget.builder(context, _controller), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue