【问题标题】:Flutter Http Request is returning nullFlutter Http请求返回null
【发布时间】:2020-12-12 12:53:03
【问题描述】:

我正在尝试向 API 发出一些 http 请求。第一个是获取数据并将其显示在列表视图中,第二个是更多数据,但我想在新页面上显示它。我目前拥有的代码为第二个 Total 请求返回 null。如果我单独运行总代码,它可以正常工作并在列表视图中显示数据。

main.dart

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

void main() => runApp(MyApp(
      products: fetchProducts(),
      total: fetchTotal(),
    ));

List<Product> parseProducts(String responseBody) {
  final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
  return parsed.map<Product>((json) => Product.fromJson(json)).toList();
}

Future<List<Product>> fetchProducts() async {
  final response =
      await http.get('http://10.0.0.102:9000/all/aF63z0R0jlQR7sfOgBAgOCOsQgv1');
  if (response.statusCode == 200) {
    return parseProducts(response.body);
  } else {
    throw Exception("Unable to access Server.");
  }
}

class MyApp extends StatelessWidget {
  final Future<List<Product>> products;
  final Future<List<Total>> total;
  MyApp({Key key, this.products, this.total}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        title: 'Product Navigation demo home page',
        products: products,
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;
  final Future<List<Product>> products;
  final Future<List<Total>> total;
  MyHomePage({Key key, this.title, this.products, this.total})
      : super(key: key);

  // final items = Product.getProducts();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Product Navigation")),
      body: Center(
        child: FutureBuilder<List<Product>>(
          future: products,
          builder: (context, snapshot) {
            if (snapshot.hasError) print(snapshot.error);
            return snapshot.hasData
                ? ProductBoxList(items: snapshot.data)

                // return the ListView widget :
                : Center(child: CircularProgressIndicator());
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => TotalPage()));
        },
        child: Icon(Icons.navigation),
        backgroundColor: Colors.green,
      ),
    );
  }
}

class ProductBoxList extends StatelessWidget {
  final List<Product> items;
  ProductBoxList({Key key, this.items});

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        return GestureDetector(
          child: ProductBox(item: items[index]),
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => ProductPage(item: items[index]),
              ),
            );
          },
        );
      },
    );
  }
}

class ProductPage extends StatelessWidget {
  ProductPage({Key key, this.item}) : super(key: key);
  final Product item;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(this.item.pName),
      ),
      body: Center(
        child: Container(
          padding: EdgeInsets.all(0),
          child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Expanded(
                    child: Container(
                        padding: EdgeInsets.all(5),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            Text(this.item.pName,
                                style: TextStyle(fontWeight: FontWeight.bold)),
                            Text("Price: " + this.item.price),
                            Text("Barcode: " + this.item.barcode.toString()),
                          ],
                        )))
              ]),
        ),
      ),
    );
  }
}

class ProductBox extends StatelessWidget {
  ProductBox({Key key, this.item}) : super(key: key);
  final Product item;

  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.all(2),
        height: 140,
        child: Card(
          child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Expanded(
                    child: Container(
                        padding: EdgeInsets.all(5),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            Text(this.item.pName,
                                style: TextStyle(fontWeight: FontWeight.bold)),
                            Text("Price: " + this.item.price),
                            Text("Barcode: " + this.item.barcode.toString()),
                          ],
                        )))
              ]),
        ));
  }
}

List<Total> parseTotal(String responseBody) {
  final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
  return parsed.map<Total>((json) => Total.fromJson(json)).toList();
}

Future<List<Total>> fetchTotal() async {
  final response = await http.get('http://10.0.0.102:8000/testData.json');
  if (response.statusCode == 200) {
    return parseTotal(response.body);
  } else {
    throw Exception("Unable to access Server.");
  }
}

class TotalPage extends StatelessWidget {
  final String title;
  final Future<List<Total>> total;

  TotalPage({Key key, this.title, this.total}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Product Navigation")),
      body: Center(
        child: FutureBuilder<List<Total>>(
          future: total,
          builder: (context, snapshot) {
            if (snapshot.hasError) print(snapshot.error);
            print(snapshot.data);
            return snapshot.hasData
                ? TotalBoxList(items: snapshot.data)

                // return the ListView widget :
                : Center(child: CircularProgressIndicator());
          },
        ),
      ),
    );
  }
}

class TotalBoxList extends StatelessWidget {
  final List<Total> items;
  TotalBoxList({Key key, this.items});

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        return GestureDetector(
          child: TotalDisplay(item: items[index]),
        );
      },
    );
  }
}

class TotalDisplay extends StatelessWidget {
  TotalDisplay({Key key, this.item}) : super(key: key);
  final Total item;

  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.all(2),
        height: 140,
        child: Card(
          child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Expanded(
                    child: Container(
                        padding: EdgeInsets.all(5),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            Text(this.item.total.toString(),
                                style: TextStyle(fontWeight: FontWeight.bold)),
                          ],
                        )))
              ]),
        ));
  }
}

total.dart

import 'package:flutter/foundation.dart';

class Total {
  final double total;

  Total(this.total);
  factory Total.fromJson(Map<String, dynamic> data) {
    return Total(
      data['total'],
    );
  }
}

【问题讨论】:

    标签: api http flutter


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    你忘了传递total
    第一步:MyHomePage

    MyHomePage(
            title: 'Product Navigation demo home page',
            products: products,
            total: total, //here
          ),
    

    第二步:FloatingActionButton

    floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => TotalPage(
                            total: total,
                          ))); //here
            },
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'dart:convert';
    import 'package:http/http.dart' as http;
    
    void main() => runApp(MyApp(
          products: fetchProducts(),
          total: fetchTotal(),
        ));
    
    List<Product> parseProducts(String responseBody) {
      final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
      return parsed.map<Product>((json) => Product.fromJson(json)).toList();
    }
    
    Future<List<Product>> fetchProducts() async {
      /*final response =
      await http.get('http://10.0.0.102:9000/all/aF63z0R0jlQR7sfOgBAgOCOsQgv1');*/
      String jsonString = '''
      [
      {
          "pName":"1",
          "price":"2",
          "barcode": 3
          
      },
      {
          "pName":"4",
          "price":"5",
          "barcode": 6
          
      }
    ]
      ''';
      final response = http.Response(jsonString, 200);
      if (response.statusCode == 200) {
        return parseProducts(response.body);
      } else {
        throw Exception("Unable to access Server.");
      }
    }
    
    class MyApp extends StatelessWidget {
      final Future<List<Product>> products;
      final Future<List<Total>> total;
      MyApp({Key key, this.products, this.total}) : super(key: key);
    
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(
            title: 'Product Navigation demo home page',
            products: products,
            total: total, //here
          ),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      final String title;
      final Future<List<Product>> products;
      final Future<List<Total>> total;
      MyHomePage({Key key, this.title, this.products, this.total})
          : super(key: key);
    
      // final items = Product.getProducts();
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("Product Navigation")),
          body: Center(
            child: FutureBuilder<List<Product>>(
              future: products,
              builder: (context, snapshot) {
                if (snapshot.hasError) print(snapshot.error);
                return snapshot.hasData
                    ? ProductBoxList(items: snapshot.data)
    
                    // return the ListView widget :
                    : Center(child: CircularProgressIndicator());
              },
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => TotalPage(
                            total: total,
                          ))); //here
            },
            child: Icon(Icons.navigation),
            backgroundColor: Colors.green,
          ),
        );
      }
    }
    
    class ProductBoxList extends StatelessWidget {
      final List<Product> items;
      ProductBoxList({Key key, this.items});
    
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return GestureDetector(
              child: ProductBox(item: items[index]),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => ProductPage(item: items[index]),
                  ),
                );
              },
            );
          },
        );
      }
    }
    
    class ProductPage extends StatelessWidget {
      ProductPage({Key key, this.item}) : super(key: key);
      final Product item;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.item.pName),
          ),
          body: Center(
            child: Container(
              padding: EdgeInsets.all(0),
              child: Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Expanded(
                        child: Container(
                            padding: EdgeInsets.all(5),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                              children: <Widget>[
                                Text(this.item.pName,
                                    style: TextStyle(fontWeight: FontWeight.bold)),
                                Text("Price: " + this.item.price),
                                Text("Barcode: " + this.item.barcode.toString()),
                              ],
                            )))
                  ]),
            ),
          ),
        );
      }
    }
    
    class ProductBox extends StatelessWidget {
      ProductBox({Key key, this.item}) : super(key: key);
      final Product item;
    
      Widget build(BuildContext context) {
        return Container(
            padding: EdgeInsets.all(2),
            height: 140,
            child: Card(
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: <Widget>[
                    Expanded(
                        child: Container(
                            padding: EdgeInsets.all(5),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                              children: <Widget>[
                                Text(this.item.pName,
                                    style: TextStyle(fontWeight: FontWeight.bold)),
                                Text("Price: " + this.item.price),
                                Text("Barcode: " + this.item.barcode.toString()),
                              ],
                            )))
                  ]),
            ));
      }
    }
    
    List<Total> parseTotal(String responseBody) {
      final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
      List<Total> a = parsed.map<Total>((json) => Total.fromJson(json)).toList();
      return a;
    }
    
    Future<List<Total>> fetchTotal() async {
      print("fetchTotal");
      //final response = await http.get('http://10.0.0.102:8000/testData.json');
      String jsonString = '''
      [
      {
          "total":124.4      
      },
      {
         "total":123.1  
      }
    ]
      ''';
      final response = http.Response(jsonString, 200);
      if (response.statusCode == 200) {
        return parseTotal(response.body);
      } else {
        throw Exception("Unable to access Server.");
      }
    }
    
    class TotalPage extends StatelessWidget {
      final String title;
      final Future<List<Total>> total;
    
      TotalPage({Key key, this.title, this.total}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("Product Navigation")),
          body: Center(
            child: FutureBuilder<List<Total>>(
              future: total,
              builder: (context, snapshot) {
                if (snapshot.hasError) print(snapshot.error);
                return snapshot.hasData
                    ? TotalBoxList(items: snapshot.data)
    
                    // return the ListView widget :
                    : Center(child: CircularProgressIndicator());
              },
            ),
          ),
        );
      }
    }
    
    class TotalBoxList extends StatelessWidget {
      final List<Total> items;
      TotalBoxList({Key key, this.items});
    
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return GestureDetector(
              child: TotalDisplay(item: items[index]),
            );
          },
        );
      }
    }
    
    class TotalDisplay extends StatelessWidget {
      TotalDisplay({Key key, this.item}) : super(key: key);
      final Total item;
    
      Widget build(BuildContext context) {
        return Container(
            padding: EdgeInsets.all(2),
            height: 140,
            child: Card(
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                  children: <Widget>[
                    Expanded(
                        child: Container(
                            padding: EdgeInsets.all(5),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                              children: <Widget>[
                                Text(this.item.total.toString(),
                                    style: TextStyle(fontWeight: FontWeight.bold)),
                              ],
                            )))
                  ]),
            ));
      }
    }
    
    class Total {
      final double total;
    
      Total(this.total);
      factory Total.fromJson(Map<String, dynamic> data) {
        return Total(
          data['total'],
        );
      }
    }
    
    class Product {
      String pName;
      String price;
      int barcode;
    
      Product({this.pName, this.price, this.barcode});
      factory Product.fromJson(Map<String, dynamic> data) {
        return Product(
            pName: data["pName"], price: data["price"], barcode: data["barcode"]);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 2016-11-08
      • 2023-04-05
      • 2021-04-24
      • 1970-01-01
      • 2017-11-25
      • 2019-08-26
      • 2017-03-12
      • 2016-03-31
      相关资源
      最近更新 更多