「Flutter/外部ライブラリ/pref and json」の版間の差分
提供: 初心者エンジニアの簡易メモ
(同じ利用者による、間の2版が非表示) | |||
行133: | 行133: | ||
main.dart | main.dart | ||
− | |||
<pre> | <pre> | ||
class _ListPageState extends State<ListPage> { | class _ListPageState extends State<ListPage> { | ||
List<Article> articles = new List<Article>(); | List<Article> articles = new List<Article>(); | ||
@override | @override | ||
− | void initState() { | + | void initState() async { |
articles.clear(); | articles.clear(); | ||
ArticleDao dao = new ArticleDao(); | ArticleDao dao = new ArticleDao(); | ||
− | List<Article> | + | List<Article> tmpArticles = await dao.findAll(); |
setState(() { | setState(() { | ||
− | articles = | + | articles = tmpArticles; |
}); | }); | ||
} | } | ||
</pre> | </pre> | ||
− | + | ↓のようにも書けるがthenは古い書き方なので↑のほうが良いっぽい。 | |
+ | main.dart | ||
<pre> | <pre> | ||
class _ListPageState extends State<ListPage> { | class _ListPageState extends State<ListPage> { | ||
行156: | 行156: | ||
articles.clear(); | articles.clear(); | ||
ArticleDao dao = new ArticleDao(); | ArticleDao dao = new ArticleDao(); | ||
− | dao.findAll().then(( | + | dao.findAll().then((tmpArticles) { |
setState(() { | setState(() { | ||
− | articles = | + | articles = tmpArticles; |
}); | }); | ||
}); | }); |
2019年5月15日 (水) 10:52時点における最新版
prefとjsonを使ったサンプル
prefとjsonを使ったdaoクラスを作る
lib/model/pref.dart
import 'dart:convert'; import 'package:memotyou/home/init/article.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Pref { static String articlesKey = 'articles'; static String articleIdKey = 'articleId'; static String articleBodyKey = 'articleBody'; static void saveArticles(List<Article> articles) async { SharedPreferences prefs = await SharedPreferences.getInstance(); List<String> prefArticles = new List<String>(); articles.forEach((article) { String articleJson = json.encode(article.toJson()); print("json save $articleJson"); prefArticles.add(articleJson); }); await prefs.setStringList(articlesKey, prefArticles); } static Future<List<Article>> getArticles() async { SharedPreferences prefs = await SharedPreferences.getInstance(); List<String> prefArticles = prefs.getStringList(articlesKey); if (prefArticles == null) { prefArticles = new List<String>(); } List<Article> articles = List<Article>(); prefArticles.forEach((articleJson) { print("json load $articleJson"); dynamic mapArticle = json.decode(articleJson); Article article = Article.fromJson(mapArticle); articles.add(article); }); return articles; } }
lib/dao/article_dao.dart
import 'package:collection/collection.dart'; import 'package:memotyou/home/init/article.dart'; import 'package:memotyou/home/model/pref.dart'; class ArticleDao { Future<List<Article>> findAll() async { List<Article> tmpArticles = new List<Article>(); List<Article> articles = await Pref.getArticles(); articles.forEach((tmpArticle) { if (tmpArticle != null && tmpArticle.id != null) { tmpArticles.add(tmpArticle); } }); reverse(tmpArticles); return tmpArticles; } Future<Article> findRowById(int id) async { List<Article> articles = await Pref.getArticles(); Article article; articles.forEach((tmpArticle) { print(tmpArticle.name); print(tmpArticle.body); if (tmpArticle.id == id) { article = tmpArticle; } }); return article; } Future<int> insert(Article article) async { List<Article> articles = await Pref.getArticles(); List<Article> tmpArticles = new List<Article>(); int maxId = 0; articles.forEach((tmpArticle) { if (tmpArticle != null && tmpArticle.id != null) { if (tmpArticle.id > maxId) { maxId = tmpArticle.id; } tmpArticles.add(tmpArticle); } }); article.id = maxId + 1; tmpArticles.add(article); int lastId = article.id; Pref.saveArticles(tmpArticles); return lastId; } Future<int> updateById(Article article,int id) async { List<Article> articles = await Pref.getArticles(); bool updateFlug = false; List<Article> tmpArticles = new List<Article>(); int lastId = 0; articles.forEach((tmpArticle) { print(tmpArticle.name); print(tmpArticle.body); if (tmpArticle.id == id) { tmpArticles.add(article); updateFlug = true; lastId = tmpArticle.id; } else { tmpArticles.add(tmpArticle); } }); if (!updateFlug) { tmpArticles.add(article); } Pref.saveArticles(tmpArticles); return lastId; } Future<int> deleteById(int id) async { List<Article> articles = await Pref.getArticles(); List<Article> tmpArticles = new List<Article>(); int lastId = 0; articles.forEach((tmpArticle) { if (tmpArticle.id == id) { lastId = tmpArticle.id; } else { tmpArticles.add(tmpArticle); } }); Pref.saveArticles(tmpArticles); return lastId; } }
main.dart
class _ListPageState extends State<ListPage> { List<Article> articles = new List<Article>(); @override void initState() async { articles.clear(); ArticleDao dao = new ArticleDao(); List<Article> tmpArticles = await dao.findAll(); setState(() { articles = tmpArticles; }); }
↓のようにも書けるがthenは古い書き方なので↑のほうが良いっぽい。
main.dart
class _ListPageState extends State<ListPage> { List<Article> articles = new List<Article>(); @override void initState() { articles.clear(); ArticleDao dao = new ArticleDao(); dao.findAll().then((tmpArticles) { setState(() { articles = tmpArticles; }); }); }
非同期で取得した値をarticlesへ入れる部分についてsetStateで囲むのが味噌です。