Flutter数据获取插件simple_fetch的使用

Flutter数据获取插件simple_fetch的使用

simple_fetch 是一个基于 Dio 的封装。它简化了在 Dart/Flutter 中处理模型和 HTTP 请求的复杂性。

开始使用

安装

pubspec.yaml 文件中添加 simple_fetch 包。

import 'package:simple_fetch/simple_fetch.dart';

final simpleFetch = SimpleFetch();
String apiUrl = 'https://jsonplaceholder.typicode.com/todos/';
非常简单的使用
testGet() async {
  List<Todo?> allProductsData = await simpleFetch.getList<Todo>(
    url: apiUrl,
    mapper: (json) => Todo?.fromJson(json),
  );
}

示例

执行 GET 请求
获取单个对象并将其转换为模型类型
/// 从端点获取单个数据项
void getOneDataItemFromEndpoint() async {
  SimpleFetch simpleFetch = SimpleFetch();

  String apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';

  try {
    Todo? productsData = await simpleFetch.get<Todo>(
      url: apiUrl,
      mapper: (json) => Todo?.fromJson(json),
      // transformer: (transform) => transform['data'],
    );
    print(productsData?.toJson());
  } on SimpleError catch (exception) {
    print(exception.message);
  } catch (e) {}
}
获取列表对象并将其转换为模型类型
/// 从端点获取数据列表
void getDataFromEndpoint() async {
  SimpleFetch simpleFetch = SimpleFetch();

  String apiUrl = 'https://jsonplaceholder.typicode.com/todos/';

  try {
    List<Todo?> allProductsData = await simpleFetch.getList<Todo>(
      url: apiUrl,
      mapper: (json) => Todo?.fromJson(json),
    );

    print(allProductsData.map((e) => e?.toJson()).toList());
  } on SimpleError catch (exception) {
    print(exception.message);
  } catch (e) {}
}
执行 POST 请求
如果您的 POST 请求响应是一个单一项目
/// 如果POST请求的响应是一个单独的项目
void postSingleResponse() async {
  SimpleFetch simpleFetch = SimpleFetch();

  String apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';

  try {
    Todo? productsData = await simpleFetch.post<Todo>(
      url: apiUrl,
      data: {'id': 1, 'name': 'hello'},
      mapper: (json) => Todo?.fromJson(json),
      // transformer: (transform) => transform['data'],
    );
    print(productsData?.toJson());
  } on SimpleError catch (exception) {
    print(exception.message);
  } catch (e) {}
}
如果您的 POST 请求响应是一个项目列表
/// 如果POST请求的响应是一个项目列表
void postMultipleResponse() async {
  SimpleFetch simpleFetch = SimpleFetch();

  String apiUrl = 'https://jsonplaceholder.typicode.com/todos/';

  try {
    List<Todo?> allProductsData = await simpleFetch.postList<Todo>(
      url: apiUrl,
      data: {'id': 2, 'name': 'Hiiii'},
      mapper: (json) => Todo?.fromJson(json),
    );

    print(allProductsData.map((e) => e?.toJson()).toList());
  } on SimpleError catch (exception) {
    print(exception.message);
  } catch (e) {}
}
并发执行多个请求
response = await Future.wait([request1, request2]);

转换器

默认情况下,包设计用于简单地检索列表或 JSON 数据。有时你可能希望在将数据转换为对象之前对其进行修改(如删除、添加或过滤)。transformer 参数可以帮助你实现这一点。

例如:

try {
  List<Todo?> allProductsData = await simpleFetch.getList<Todo>(
    url: apiUrl,
    mapper: (json) => Todo?.fromJson(json),
    transformer: (transform) => transform['data'],
  );

  print(allProductsData.map((e) => e?.toJson()).toList());
} on SimpleError catch (exception) {
  print(exception.message);
} catch (e) {}

示例代码

以下是在 main.dart 文件中的完整示例代码:

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:example/models/todo_model.dart';
import 'package:simple_fetch/simple_fetch.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const SimpleFetchTestApp();
  }
}

class SimpleFetchTestApp extends StatefulWidget {
  const SimpleFetchTestApp({super.key});

  [@override](/user/override)
  State<SimpleFetchTestApp> createState() => _SimpleFetchTestAppState();
}

class _SimpleFetchTestAppState extends State<SimpleFetchTestApp> {

  void getDataFromEndpoint() async {
    SimpleFetch simpleFetch = SimpleFetch();

    String apiUrl = 'https://jsonplaceholder.typicode.com/todos/';

    try {
      List<Todo?> allProductsData = await simpleFetch.getList<Todo>(
        url: apiUrl,
        mapper: (json) => Todo?.fromJson(json),
      );

      print(allProductsData.map((e) => e?.toJson()).toList());
    } on SimpleError catch (exception) {
      print(exception.message);
    } catch (e) {}
  }

  void getOneDataItemFromEndpoint() async {
    SimpleFetch simpleFetch = SimpleFetch();

    String apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';

    try {
      Todo? productsData = await simpleFetch.get<Todo>(
        url: apiUrl,
        mapper: (json) => Todo?.fromJson(json),
        // transformer: (transform) => transform['data'],
      );
      print(productsData?.toJson());
    } on SimpleError catch (exception) {
      print(exception.message);
    } catch (e) {}
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          const SizedBox(
            height: 120,
          ),
          Column(
            children: [
              CupertinoButton(
                  color: Theme.of(context).primaryColor,
                  child: const Text("Fetch All..."),
                  onPressed: () {
                    getDataFromEndpoint();
                  }),
              const SizedBox(
                height: 60,
              ),
              CupertinoButton(
                  color: Theme.of(context).primaryColor,
                  child: const Text("Single Fetch..."),
                  onPressed: () {
                    getOneDataItemFromEndpoint();
                  }),
            ],
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用simple_fetch插件进行数据获取的示例代码。simple_fetch插件通常用于简化HTTP请求和处理数据。

首先,你需要在pubspec.yaml文件中添加simple_fetch依赖项:

dependencies:
  flutter:
    sdk: flutter
  simple_fetch: ^x.y.z  # 请将x.y.z替换为当前最新版本号

然后运行flutter pub get来安装依赖项。

接下来,在你的Flutter项目中,你可以按照以下步骤使用simple_fetch进行数据获取:

  1. 创建数据模型:定义一个数据模型类,用于解析从服务器获取的数据。
import 'dart:convert';

class UserData {
  final String name;
  final int age;

  UserData({required this.name, required this.age});

  factory UserData.fromJson(Map<String, dynamic> json) {
    return UserData(
      name: json['name'] as String,
      age: json['age'] as int,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
    };
  }

  @override
  String toString() {
    return jsonEncode(toJson());
  }
}
  1. 创建API服务:使用simple_fetch创建API服务类。
import 'package:flutter/material.dart';
import 'package:simple_fetch/simple_fetch.dart';
import 'user_data.dart'; // 导入你创建的数据模型类

class ApiService {
  final SimpleFetch fetch = SimpleFetch();

  Future<UserData?> getUser(String userId) async {
    final response = await fetch.get(
      url: 'https://api.example.com/users/$userId', // 替换为你的API端点
      parser: (response) {
        if (response.statusCode == 200) {
          Map<String, dynamic> body = jsonDecode(response.body);
          return UserData.fromJson(body);
        } else {
          throw Exception('Failed to load user');
        }
      },
    );
    return response;
  }
}
  1. 在UI中使用API服务:在你的Flutter小部件中使用API服务来获取数据并显示。
import 'package:flutter/material.dart';
import 'api_service.dart'; // 导入你创建的API服务类

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

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

class UserScreen extends StatefulWidget {
  @override
  _UserScreenState createState() => _UserScreenState();
}

class _UserScreenState extends State<UserScreen> {
  UserData? user;
  final ApiService apiService = ApiService();

  @override
  void initState() {
    super.initState();
    _loadUser();
  }

  Future<void> _loadUser() async {
    try {
      user = await apiService.getUser('1'); // 替换为实际的用户ID
    } catch (e) {
      print(e);
    }

    if (mounted) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('User Data'),
      ),
      body: Center(
        child: user == null
            ? CircularProgressIndicator()
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Name: ${user!.name}'),
                  Text('Age: ${user!.age}'),
                ],
              ),
      ),
    );
  }
}

在上面的代码中,我们定义了一个数据模型UserData,一个API服务类ApiService,并在UserScreen小部件中使用这个服务来获取和显示用户数据。

注意:

  • 确保你替换了示例中的API端点和用户ID为实际的值。
  • 错误处理部分可以根据你的需求进行扩展,比如显示Snackbar或者Dialog。

这样,你就可以在Flutter应用中使用simple_fetch插件进行数据获取了。

回到顶部