Flutterを使用したアプリケーションの作成(5)
前言
最初の連読から本文を読むと、天気appの簡易版を書いたかもしれませんが、データのキャッシュやリストの美しさはまだ十分ではありません.本稿では,都市リストを変更し,取得したネットワークデータをファイルでキャッシュし,ネットワークデータが得られない場合に用いる.
1.宮格に変更
CityWidgetのbuildメソッドを宮格に変更したWidgetに戻す
2.カードカードの追加:
3.キャッシュを追加
キャッシュはローカルファイルに保存する準備ができています.依存を追加する必要があります.
CityDataにパッケージをインポートするには、次の手順に従います.
キャッシュファイルの作成
ローカルにキャッシュ
ローカルから都市リストを取得
CityWidgetにキャッシュ機能を追加する
締めくくり
ここまで宮格+カード+キャッシュはもう分かち合って終わりました.効果はまあまあです.文章を読むあなたが好きになってほしいです.
最初の連読から本文を読むと、天気appの簡易版を書いたかもしれませんが、データのキャッシュやリストの美しさはまだ十分ではありません.本稿では,都市リストを変更し,取得したネットワークデータをファイルでキャッシュし,ネットワークデータが得られない場合に用いる.
1.宮格に変更
CityWidgetのbuildメソッドを宮格に変更したWidgetに戻す
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),//
itemCount: cityList.length,
itemBuilder: (context, index) {
return ListTile(
title:Text(
cityList[index].name,
style: TextStyle(color: Colors.white, fontSize: 22))
),
onTap: () {
//
// Navigator.pushNamed(context, "weather");
//
Navigator.push<String>(context,
MaterialPageRoute(builder: (context) =>
WeatherWidget(cityList[index].name)))
.then((String value) {
//
});
},
);
}
);
}
2.カードカードの追加:
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3),
itemCount: cityList.length,
itemBuilder: (context, index) {
return ListTile(
title: new Card(
elevation: 5.0, //
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(14.0))),
semanticContainer: true,
// ,false child, view
child: new Scaffold(
body: new Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset("images/item_bg.jpg", fit: BoxFit.fitHeight),
Center(
child: Text(
cityList[index].name,
style: TextStyle(color: Colors.white, fontSize: 22)),)
],),
),),
onTap: () {
//
// Navigator.pushNamed(context, "weather");
//
Navigator.push<String>(context,
MaterialPageRoute(builder: (context) =>
WeatherWidget(cityList[index].name)))
.then((String value) {
//
});
},
);
}
);
}
3.キャッシュを追加
キャッシュはローカルファイルに保存する準備ができています.依存を追加する必要があります.
path_provider: ^0.5.0+1
CityDataにパッケージをインポートするには、次の手順に従います.
import 'dart:io';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
import 'dart:convert';
キャッシュファイルの作成
static Future<File> getCacheFile() async {
String dir = (await getApplicationDocumentsDirectory()).path;
return new File('$dir/cities.txt');
}
ローカルにキャッシュ
static void saveToLocal(String cityListJson) async {
var file = await getCacheFile();
file.writeAsString(cityListJson);
}
ローカルから都市リストを取得
static Future<List<CityData>> getCitiesFromLocal() async {
List<CityData> list = new List();
try {
dynamic content = (await getCacheFile()).readAsString();
var cityJson = await json.decode(content);
for (dynamic city in cityJson['HeWeather6'][0]['basic']) {
CityData cityData = CityData(name: city['location']);
list.add(cityData);
}
return list;
} catch (e) {
return list;
}
}
CityWidgetにキャッシュ機能を追加する
Future<List<CityData>> _futureGetCityList() async {
......
if (response.statusCode == HttpStatus.OK) {
......
//
CityData.saveToLocal(responseBody);
}
} catch (exception) {
print(exception.toString());
}
if (data.isEmpty) {
//
data.addAll((await CityData.getCitiesFromLocal()));
}
return data;
}
締めくくり
ここまで宮格+カード+キャッシュはもう分かち合って終わりました.効果はまあまあです.文章を読むあなたが好きになってほしいです.