代码之家  ›  专栏  ›  技术社区  ›  hs777it

flutter:获取职位列表是最佳实践代码吗?

  •  0
  • hs777it  · 技术社区  · 6 年前

    我从API获取帖子的flutter代码是:

    Future<List<Posts>> fetchPosts() async {
    var url = 'https://*****.com/wp-json/wp/v2/posts';
    final response = await http.get(url, headers: {"Accept": 'application/json'});
    if (response.statusCode == 200) {
        setState(() {
          var jsonData = json.decode(response.body);
          for (var p in jsonData) {
            Posts post = Posts(
              id: p['id'],
              date: p['date'],
              title: p['title'],
              link: p['link'],
              postViews: p['views'],
              featuredImage: p['featured_image'],
              featuredImageBig: p['featured_image_big'],
              categories: p['categories'],
              comments: p['comments'],
              content: p['content'],
            );
            posts.add(post);
          }
        });      
    } 
    }}
    

    我问,获取帖子列表是否是最佳实践代码?

    感谢前进

    2 回复  |  直到 6 年前
        1
  •  0
  •   Siavash    6 年前

    假设您有一个名为post的类:

    class Post {
      final String id;
      final String link;
      final String imageUrl;
      final String title;
    
      Post(this.id, this.link, this.imageUrl, this.title);
    
      factory Post.fromJson(Map<String, dynamic> json) {
        return new Post(json['id'], json['link'], json['imageUrl'], json['title']);
      }
    
      static Future<List<Post>> get(int skip, int take) async {
        var response =
            await Api.get('api/v1/posts?SkipCount=$skip&MaxResultCount=$take&');
    
        final responseJson = json.decode(response.body);
        final items = (responseJson["items"] as List).map((i) => new Post.fromJson(i));
    
        return items.toList();
      }
    }
    

    你唯一需要的是API类:

    import 'dart:async';
    import 'package:http/http.dart' as http;
    
    class Api{
      static const String BaseUrl = 'http://yourapiwebsite.com/';
    
      static Future<http.Response> get(String url){
        return http.get(BaseUrl + url);
      }
    }
    

    这可以处理所有正常的呼叫。如果要将动态参数从UI传递到API,可以使用块并从中获取参数。

        2
  •  0
  •   01leo    6 年前

    首先,我认为你的函数中没有返回任何内容。另外,变量posts,我想是一个列表,在函数内部不存在。所以我会这样改变它:

    Future<List<Posts>> fetchPosts() async {
        List<Posts> posts = [];    
    
        var url = 'https://*****.com/wp-json/wp/v2/posts';
        final response = await http.get(url, headers: {"Accept": 'application/json'});
        if (response.statusCode == 200) {
          setState(() {
            var jsonData = json.decode(response.body);
            for (var p in jsonData) {
              Posts post = Posts(
                id: p['id'],
                date: p['date'],
                title: p['title'],
                link: p['link'],
                postViews: p['views'],
                featuredImage: p['featured_image'],
                featuredImageBig: p['featured_image_big'],
                categories: p['categories'],
                comments: p['comments'],
                content: p['content'],
              );
              posts.add(post);
            }
          });
        }
    
        return posts;
      }}
    

    此实现适用于小规模应用程序。当应用程序的规模增加,并且您可能支持不同类型的请求和此类请求时,您应该查看Bloc模式以获得最佳实践。

    您可以在Tensor编程通道上找到使用bloc模式和Web API的示例: https://www.youtube.com/watch?v=ALcbTxz3bUw