blog

Flutter開発0から1へ フレームワークとネットワーク

APPの開発、私はAndroidのグループリーダーとして、新しいプロジェクトを立ち上げ、私は技術的な事前研究を行います。例えば、「Androidの一般的なフレームワークの完全なセット」、一般的にMVP...

Apr 14, 2020 · 6 min. read
シェア

フレームワーク

これも新しいプロジェクトで、Flutterのウェブリクエストフレームワークに何を使うべきか、技術的なリサーチをする必要があります。イメージの読み込みは?記事の詳細にはMarkdownを使う予定ですが、Flutterはそれを実装できますか?これらはすべて事前にリサーチする必要があります。

このプロジェクトでは、コードのバージョン管理にはGitHubを使います。 まず、新しいFlutterプロジェクトと新しいプライベートGitHubプロジェクトを作成し、以下のコマンドを使ってローカルのコードとリモートのGitHubを関連付けます。

echo "# andblog" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://.//.it
git push -u origin master

関連付けに問題がなく、後で変更を加えたい場合は、Android Studio付属のGitを使ってコードを直接コミットできます。

次は、Flutterウェブリクエストフレームワークは何を使っているのか?どのように機能するのでしょうか?

ネットワーク

データ・ソース

ネットワークリクエストフレームワークというと、まずデータの出所の問題を解決するために、バックエンドを持っていない、サーバーがない、どうやって入手するのか?急がない、彼らはゼロからAPPの開発の記事のこのシリーズは、単独でプロジェクトを行うことができると言う、私は当然方法を持っています。

http

ウェブ・リクエスト・フレームワークのデータがあります。

例として、Postmanを使って記事のリストをリクエストするデータ構造を見てみましょう:

{
 "results": [
 {
 "content": "記事の内容テスト1",
 "cover": "http://..//--/.pg",
 "createdAt": " ",
 "date": "",
 "objectId": "ct7BGGGV",
 "summary": "要約1",
 "title": "タイトルテスト1",
 "updatedAt": " "
 },
 {
 "content": "記事の内容テスト2",
 "cover": "http://..//--/.pg",
 "createdAt": " ",
 "date": "",
 "objectId": "3L42777G",
 "summary": "まとめ2",
 "title": "タイトルテスト2",
 "updatedAt": " "
 }
 ]
}

Flutterが提供するWebリクエストフレームワークはhttp、アドレスです:

httpパッケージをpubspec.yamlに追加します:

dependencies:
 http: ^0.12.1

プロジェクトルートからflutter pub getコマンドを実行してパッケージをインストールします。

新しいblog_list_page.dartは、記事リストを表示するために使用され、blog.dartは記事リストの構造テーブルであり、直接記事リストをロードするエントリmain.dartを配置し、詳細なコードは次のとおりです。

main.dart:

import 'package:flutter/material.dart';
import 'andblog/list/blog_list_page.dart';
void main() {
 runApp(MyApp());
}
class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return MaterialApp(
 title: 'AndBlog',
 theme: ThemeData(
 primarySwatch: Colors.blue,
 visualDensity: VisualDensity.adaptivePlatformDensity,
 ),
 home: new BlogListPage(),
 );
 }
}

blog_list_page.dart:

import 'package:flutter/material.dart';
import 'package:flutter_andblog/andblog/http/http_common.dart';
import 'package:http/http.dart' as http;
import 'blog.dart';
class BlogListPage extends StatefulWidget {
 @override
 BlogListPageState createState() => new BlogListPageState();
}
class BlogListPageState extends State<BlogListPage> {
 List<Blog> blogList = [];
 @override
 void initState() {
 super.initState();
 //ページに入るとすぐにインターフェースを要求する
 getBlogListData();
 }
 //Webリクエスト
 getBlogListData() async {
 var response = await http.get(HttpCommon.blog_list_url, headers: HttpCommon.headers());
 if (response.statusCode == 200) {
 // setState runOnUiの Threadに相当する。
 setState(() {
 blogList = Blog.decodeData(response.body);
 });
 }
 }
 @override
 Widget build(BuildContext context) {
 return Scaffold(
 appBar: AppBar(
 title: Text('AndBlog'),
 ),
 body: Center(
 child: Column(
 mainAxisAlignment: MainAxisAlignment.center,
 children: <Widget>[
 Text(
 'You have pushed the button this many times:',
 ),
 ],
 ),
 ),
 floatingActionButton: FloatingActionButton(
 tooltip: 'Increment',
 child: Icon(Icons.add),
 ), // This trailing comma makes auto-formatting nicer for build methods.
 );
 }
}

すべてのネットワークURLをHttpCommonに入れます。詳細なコードはhttp_common.dartにあります:

class HttpCommon{
 static var blog_list_url = 'https://..///le/';
 static Map<String, String> headers(){
 //ヘッダーを設定する
 Map<String, String> headers = new Map();
 headers["X-Bmob-Application-Id"] = "bmob Application-Id";
 headers["X-Bmob-REST-API-Key"] = "bmob REST-API-Key";
 headers["Content-Type"] = "application/json";
 return headers;
 }
}

Webリクエストデータの解析はblog.dartにあります:

import 'dart:convert';
class Blog{
 final String content;
 final String cover;
 final String date;
 final String objectId;
 final String summary;
 final String title;
 //コンストラクタ
 Blog({
 this.content,
 this.cover,
 this.date,
 this.objectId,
 this.summary,
 this.title,
 });
 static List<Blog> decodeData(String jsonData) {
 List<Blog> blogList = new List<Blog>();
 var data = json.decode(jsonData);
 var results = data['results'];
 print('results='+results[0]['content']);
 for (int i = 0; i < results.length; i++) {
 blogList.add(fromMap(results[i]));
 }
 return blogList;
 }
 static Blog fromMap(Map<String, dynamic> map) {
 return new Blog(
 content: map['content'],
 cover: map['cover'],
 date: map['date'],
 objectId: map['objectId'],
 summary: map['summary'],
 title: map['title'],
 );
 }
}

print('results='+results[0]['content']);私は習慣的にデータが正しく解析されているかどうかを確認するために印刷し、最終的に期待に応えるために、記事のテスト1の内容を印刷するために多くの試み。

json_serializable

blog.dartの記事リストの構造を書く際に、手動でフィールドを1つずつノックし、その後パースする必要がありますが、FlutterにはGsonFormatのような自動パースプラグインはありません、もちろんあります、それはjson_serializableです、json_serializableを使用すると、通常の依存関係と2つの開発依存関係が必要です:

dependencies:
 flutter:
 sdk: flutter
 json_annotation: ^3.0.1
dev_dependencies:
 flutter_test:
 sdk: flutter
 build_runner: ^1.10.0
 json_serializable: ^3.3.0

プロジェクトルートからflutter pub getコマンドを実行してパッケージをインストールします。

記事の詳細構造を例に挙げましょう:

{
 "content": "記事の内容テスト1",
 "cover": "http://..//--/.pg",
 "createdAt": " ",
 "date": "",
 "objectId": "ct7BGGGV",
 "summary": "まとめ1",
 "title": "タイトルテスト1",
 "updatedAt": " "
}

jsonからエンティティクラスdetail.dartを作成します:

import 'package:json_annotation/json_annotation.dart';
//エンティティー・クラス・ファイルが生成されたファイルを見つけるためには、そのファイルを'detail.g.dart'
part 'detail.g.dart';
@JsonSerializable()
class Detail{
 final String content;
 final String cover;
 final String date;
 final String objectId;
 final String summary;
 final String title;
 //コンストラクタ
 Detail({
 this.content,
 this.cover,
 this.date,
 this.objectId,
 this.summary,
 this.title,
 });
}

detail.g.dartを書き終えたばかりのときにエラーが出るのは普通のことです!パーサファイルがまだ生成されていないからです。

次に、プロジェクトのルート・ディレクトリを解析し、以下のコマンドを実行します。flutter packages pub run build_runner build

detail.g.dartファイルが生成されることがわかります:

// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'detail.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Detail _$DetailFromJson(Map<String, dynamic> json) {
 return Detail(
 content: json['content'] as String,
 cover: json['cover'] as String,
 date: json['date'] as String,
 objectId: json['objectId'] as String,
 summary: json['summary'] as String,
 title: json['title'] as String,
 );
}
Map<String, dynamic> _$DetailToJson(Detail instance) => <String, dynamic>{
 'content': instance.content,
 'cover': instance.cover,
 'date': instance.date,
 'objectId': instance.objectId,
 'summary': instance.summary,
 'title': instance.title,
 };

次に、これら2つのメソッドをdetail.dartに記述します:

factory Detail.fromJson(Map<String, dynamic> json) => _$DetailFromJson(json);
Map<String, dynamic> toJson() => _$DetailToJson(this);

次に、fromJsonメソッドを呼び出して、Webリクエストからデータを解析します:

var data = json.decode(response.body);
detail = Detail.fromJson(data);
print('results='+detail.title);

このように考えると、json_serializableを使うことはGsonFormatよりも便利とは言えません。 フィールドのパースが省けるだけで、フィールドを追加するステップが自動化されるわけではありません。

Read next

goでhttpリクエストを送る

httpプロトコルの知識構造は次のとおりです:参照してください:あなたにHTTPプロトコルのリクエストとhttpに対処するための応答メッセージ構造の詳細な理解をもたらすための記事は、ほとんどがhttpプロトコルを学ぶためにメッセージを通じて、リクエストとレスポンスメッセージは、より良いことはできませんですが表示されるたびに、メッセージを参照してください。

Apr 14, 2020 · 4 min read