Flutter数据获取插件json_fetcher的使用

Flutter数据获取插件json_fetcher的使用

动机

想象一下用户第二次启动应用程序时看到一个骨骼加载屏幕或进度条,尤其是在UI部分中数据不常改变的地方。这并不是一个好的用户体验。

为了改善这一点,我们可以在第一步从缓存中加载数据,然后在第二步更新数据。

我们的目标不是最小化对服务器的请求次数,而是最小化显示数据给用户所需的时间。

使用方法

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

Future<String> get cachePath => getApplicationCacheDirectory().then((dir) => dir.path);
final client = JsonHttpClient(http.Client(), createCache(cachePath));
final postsStream = JsonFetcher<Model>(
  client,
  (json) => Model.fromJson(json),
).fetch('https://example.com/get-json');

提示

示例可以查看以下目录:

配置

在第一步中,你应该创建JsonHttpClient:

final jsonClient = JsonHttpClient(httpClient, cache);
HttpClient

此插件使用标准的Dart http包。

基本上,使用Client()来创建原始客户端已经足够了:

final jsonClient = JsonHttpClient(Client(), cache);

因此,你可以在创建JsonHttpClient之前更精确地配置客户端:

Client httpClient() {
  if (Platform.isAndroid) {
    final engine = CronetEngine.build(
        cacheMode: CacheMode.memory,
        cacheMaxSize: 1000000);
    return CronetClient.fromCronetEngine(engine);
  }
  if (Platform.isIOS || Platform.isMacOS) {
    final config = URLSessionConfiguration.ephemeralSessionConfiguration()
      ..cache = URLCache.withCapacity(memoryCapacity: 1000000);
    return CupertinoClient.fromSessionConfiguration(config);
  }
  return IOClient();
}

final jsonClient = JsonHttpClient(httpClient(), cache);

提示

该插件包含了一个方便的日志记录功能的客户端包装器LoggableHttpClient, 可以在Flutter示例中查看使用案例。

缓存

创建cache只需使用方便的函数createCache(path)

注意

path可以是String或者Future<String>

Future<String>变体在应用程序启动时通过依赖注入(DI)创建客户端非常有用,以防止不必要的等待。

在Flutter Android/iOS应用中,你可以创建一个将数据缓存在标准缓存目录中的客户端,如下所示:

import 'package:path_provider/path_provider.dart';

Future<String> get path => getApplicationCacheDirectory().then((value) => value.path);

final jsonClient = JsonHttpClient(httpClient(), createCache(path));

更多关于Flutter数据获取插件json_fetcher的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据获取插件json_fetcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,json_fetcher 是一个假设的插件名称,用于从网络获取 JSON 数据。虽然 Flutter 官方并没有直接提供一个名为 json_fetcher 的插件,但通常我们可以使用 http 包来实现类似的功能。以下是一个使用 http 包来获取 JSON 数据的示例代码。

首先,.你1需要在3你的. 3pub spec#. 请yaml检查最新版本 号文件中 添加``` http然后 ,依赖运行: `

flutter``` pubyaml get `dependencies 来: 安装 依赖flutter: sdk: flutter http: ^0。

接下来,我们编写一个 Flutter 应用,该应用将从一个假定的 API 端点获取 JSON 数据,并在屏幕上显示这些数据。

主应用代码 (main.dart)

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter JSON Fetcher Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _data = '';

  void _fetchData() async {
    var url = 'https://api.example.com/data'; // 替换为你的API端点
    var response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      // 将响应体转换为JSON字符串
      var jsonData = jsonDecode(response.body);
      // 将JSON字符串转换为可读的格式(例如,转换为字符串或处理数据)
      setState(() {
        _data = jsonEncode(jsonData, toEncodable: (value) {
          if (value is _InternalLinkedHashMap) {
            return value.map((k, v) => MapEntry(k, toEncodable(v)));
          } else if (value is List) {
            return value.map(toEncodable).toList();
          }
          return value;
        });
      });
    } else {
      setState(() {
        _data = 'Failed to load data: ${response.statusCode}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter JSON Fetcher Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Fetched Data:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              _data,
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _fetchData,
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }
}

// 辅助函数,用于处理内部LinkedHashMap的编码
typedef _InternalLinkedHashMap = Map<String, dynamic>;

解释

  1. 依赖添加:在 pubspec.yaml 中添加 http 依赖。
  2. 主应用结构MyApp 是一个 StatelessWidget,它定义了应用的主题和主页。
  3. 主页MyHomePage 是一个 StatefulWidget,它包含状态 _data 用于存储从网络获取的 JSON 数据。
  4. 数据获取_fetchData 方法使用 http.get 从指定的 URL 获取数据,并将响应体转换为 JSON 字符串。如果请求成功(状态码为 200),则更新 _data 状态。
  5. UI 展示:在 build 方法中,我们展示了一个按钮用于触发数据获取,以及一个 Text 控件用于显示获取到的 JSON 数据。

请注意,jsonEncode 函数在处理复杂 JSON 数据(如包含循环引用的数据结构)时可能会遇到问题。在实际应用中,你可能需要更精细地处理这些数据,例如将 JSON 数据转换为 Dart 对象或自定义的数据结构。

回到顶部