Flutter 通過API獲取網絡數據並解析

首先通過API獲取網絡數據這個過程是耗時的,所以我們需要進行異步操作,使用Dart語言完成異步可以參考如下的文章

https://www.jianshu.com/p/f2f7634b602c

1.網絡請求

直接進入正題,首先我進行網絡請求是通過一個工具類,大家可以直接使用

import 'package:http/http.dart' as http;

import 'dart:convert';

class NetUtils {

static void get(String url, Function callback, {Map params, Function errorCallback}) async {

if (params != null && params.isNotEmpty) {

StringBuffer sb = new StringBuffer("?");

params.forEach((key, value) {

sb.write("$key" + "=" + "$value" + "&");

});

String paramStr = sb.toString();

paramStr = paramStr.substring(0, paramStr.length - 1);

url += paramStr;

}

// print("$url");

try {

http.Response res = await http.get(url);

if (callback != null) {

callback(res.body);

}

} catch (exception) {

if (errorCallback != null) {

errorCallback(exception);

}

}

}

static void post(String url, Function callback, {Map params, Function errorCallback}) async {

try {

http.Response res = await http.post(url, body: params);

if (callback != null) {

callback(res.body);

}

} catch (e) {

if (errorCallback != null) {

errorCallback(e);

}

}

}

}

我現在使用一下,這個data就是返回的Gson字段

NetUtils.get(url, (data) {

}, errorCallback: (e) {

print("network error: $e");

});

2.解析Gson字段

雖然獲取了Gson字段,但是我們還不能獲取我們想要的數據,這樣和java一樣,需要解析Gson字段,這個flutter有相關的API實現了,我們需要導一下包,雖然這個包在NetUtil導入過,但是flutter不能間接導包

import 'dart:convert';

然後使用

NetUtils.get(url, (data) {

if (data != null) {

var obj = json.decode(data);

if (obj['error'] == false) {

//print(obj);

setState(() {

MyApp.text = obj['results'][0]['desc'];

if (MyApp.text==null){

MyApp.text=' ';

}

});

}

}

}, errorCallback: (e) {

print("network error: $e");

});

3.完整的例子

就是通過乾貨集中營的API獲取網絡數據,將其中一個分享的標題顯示出來。

這裡要注意的是非交互型控件StatelessWidget是不能刷新的,而網絡數據獲取後需要刷新控件顯示,所以我們需要自己自定義一個交互型控件,這個可以參考如下文章

https://blog.csdn.net/z979451341/article/details/80817609

好了,大家看代碼

import 'dart:async';

import 'package:flutter/material.dart';

import 'dart:convert';

import 'NetUtils.dart';

import 'AndroidBean.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

static String text='Hello World';

@override

Widget build(BuildContext context) {

return MaterialApp(

title: 'Welcome to Flutter',

home: Scaffold(

appBar: AppBar(

title: Text('Welcome to Flutter'),

),

body: Center(

child: ParentWidget(),

),

),

);

}

}

class ParentWidget extends StatefulWidget {

@override

_ParentWidgetState createState() => new _ParentWidgetState();

}

class _ParentWidgetState extends State {

bool _active = false;

@override

Widget build(BuildContext context) {

getNetData();

return new Container(

child: new Text(MyApp.text)

);

}

getNetData() async {

var url = 'http://gank.io/api/data/Android/10/1';

NetUtils.get(url, (data) {

if (data != null) {

var obj = json.decode(data);

if (obj['error'] == false) {

//print(obj);

setState(() {

MyApp.text = obj['results'][0]['desc'];

if (MyApp.text==null){

MyApp.text=' ';

}

});

}

}

}, errorCallback: (e) {

print("network error: $e");

});

}

}

AndroidBean.dart

class AndroidBean{

String desc;

List images;

String url;

String who;

static List androidData;

}

4.最後

我要做一個比較完整的app,敬請期待

Flutter 通過API獲取網絡數據並解析


分享到:


相關文章: