Skip to content

Instantly share code, notes, and snippets.

@Lecarvalho
Last active May 28, 2019 17:18
Show Gist options
  • Save Lecarvalho/c632a17ddbdc99f7342590fd176d7cbd to your computer and use it in GitHub Desktop.
Save Lecarvalho/c632a17ddbdc99f7342590fd176d7cbd to your computer and use it in GitHub Desktop.
RandomWordState with first load and no rebuild the starter state after setState() invoked
import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
class RandomWords extends StatefulWidget {
@override
RandomWordsState createState() => new RandomWordsState();
}
class RandomWordsState extends State<RandomWords> {
static final List<WordPair> _suggestions = [];
static final Set<WordPair> _saved = Set<WordPair>();
static final TextStyle _biggerFont = const TextStyle(fontSize: 18.0);
@override
initState(){
super.initState();
_suggestions.addAll(createFirstSuggestions());
}
static Iterable<WordPair> createFirstSuggestions(){
return generateWordPairs().take(20);
}
Widget _buildSuggestions() {
print("Rebuild");
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemBuilder: /*1*/ (context, i) {
if (i.isOdd) return Divider(); /*2*/
final index = i ~/ 2; /*3*/
if (index >= _suggestions.length) {
_suggestions.addAll(generateWordPairs().take(10)); /*4*/
}
return _buildRow(_suggestions[index]);
},
);
}
Widget _buildRow(WordPair pair){
final bool alreadySaved = _saved.contains(pair);
return ListTile (
title: Text(
pair.asPascalCase,
style: _biggerFont
),
trailing: Icon(
alreadySaved ? Icons.favorite : Icons.favorite_border,
color: alreadySaved ? Colors.red: null,
),
onTap : () {
setState(() {
alreadySaved ? _saved.remove(pair) : _saved.add(pair);
});
}
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Gerador de nomes de Startups"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.list),
onPressed: _pushSaved,
),
],
),
body: _buildSuggestions()
);
}
void _pushSaved(){
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (BuildContext context){
final Iterable<ListTile> tiles = _saved.map(
(WordPair pair){
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
)
);
}
);
final List<Widget> divided = ListTile.divideTiles(
context: context,
tiles: tiles
).toList();
return Scaffold(
appBar: AppBar(
title: Text("Sugestões salvas")
),
body: ListView(children: divided)
);
}
)
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment