facebook twitter hatena line email

Flutter/外部ライブラリ/pref and json

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

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で囲むのが味噌です。