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
更多关于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进行数据获取:
- 创建数据模型:定义一个数据模型类,用于解析从服务器获取的数据。
 
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());
  }
}
- 创建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;
  }
}
- 在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插件进行数据获取了。
        
      
            
            
            
