Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Last active November 27, 2023 14:06
Show Gist options
  • Save slightfoot/c3904b18a031f513c0197aeb9166a58f to your computer and use it in GitHub Desktop.
Save slightfoot/c3904b18a031f513c0197aeb9166a58f to your computer and use it in GitHub Desktop.
Example of using PageStorage to store data during usage of a PageView.
import 'package:flutter/material.dart';
void main() => runApp(new MainWidget());
class MainWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
body: new PageView.builder(
itemBuilder: (context, index) => new MainPageWidget(index),
itemCount: 3,
),
),
);
}
}
class MainPageWidget extends StatefulWidget {
final int pageIndex;
MainPageWidget(this.pageIndex) : super(key: new PageStorageKey<String>('page-$pageIndex'));
@override
_MainPageWidgetState createState() => new _MainPageWidgetState();
}
class _MainPageWidgetState extends State<MainPageWidget> {
static var pageColors = [Colors.red[50], Colors.green[50], Colors.blue[50]];
final List<TextEditingController> _editController = new List(3);
Map<String, String> _savedData;
@override
void initState() {
super.initState();
_savedData = PageStorage.of(context).readState(context, identifier: 'content-${widget.pageIndex}') ?? new Map();
for (int i = 0; i < _editController.length; i++) {
_editController[i] = new TextEditingController(text: _savedData['edit$i']);
_editController[i].addListener(() => _writeState(i, _editController[i].text));
}
}
_writeState(int editIndex, String value) {
_savedData['edit$editIndex'] = value;
PageStorage.of(context).writeState(context, _savedData, identifier: 'content-${widget.pageIndex}');
}
@override
Widget build(BuildContext context) {
return new Container(
color: pageColors[widget.pageIndex],
padding: const EdgeInsets.all(24.0),
child: new Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
new TextField(controller: _editController[0]),
new SizedBox(height: 16.0),
new TextField(controller: _editController[1]),
new SizedBox(height: 16.0),
new TextField(controller: _editController[2]),
],
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment