「Flutter/外部ライブラリ/pref and json」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==prefとjsonを使ったサンプル== prefとjsonを使ったdaoクラスを作る lib/model/pref.dart <pre> import 'dart:convert'; import 'package:memotyou/home/init...」) |
|||
| (同じ利用者による、間の5版が非表示) | |||
| 行4: | 行4: | ||
lib/model/pref.dart | lib/model/pref.dart | ||
<pre> | <pre> | ||
| − | |||
import 'dart:convert'; | import 'dart:convert'; | ||
import 'package:memotyou/home/init/article.dart'; | import 'package:memotyou/home/init/article.dart'; | ||
| 行134: | 行133: | ||
main.dart | main.dart | ||
| + | <pre> | ||
| + | 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; | ||
| + | }); | ||
| + | } | ||
| + | </pre> | ||
| + | ↓のようにも書けるがthenは古い書き方なので↑のほうが良いっぽい。 | ||
| + | main.dart | ||
<pre> | <pre> | ||
class _ListPageState extends State<ListPage> { | class _ListPageState extends State<ListPage> { | ||
| 行142: | 行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で囲むのが味噌です。
