「Flutter/外部ライブラリ/pref and json」の版間の差分
提供: 初心者エンジニアの簡易メモ
| (同じ利用者による、間の1版が非表示) | |||
| 行137: | 行137: | ||
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; |
}); | }); | ||
} | } | ||
| 行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で囲むのが味噌です。
