Search code examples
flutterdartfuturesnapshotflutter-futurebuilder

Pass data from future to another future in the same page


I'm new to the Flutter world and mobile app development and struggling with how I should pass data throughout my app. This is my code, How can I pass data from future to another future on the same page? these are my two futures and my class and my HomePage with the futurebuilders help, please.
This is my future that returns the Location. From her I need to pass the Location id to the next future.

Future<Location> Lastlocation() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'token';
    final value = prefs.get(key) ?? 0;
    String myUrl = "$serverUrl/location/getlastlocation?token=" + value;
    http.Response response = await http.get(
      myUrl,
      headers: {
        'Accept': 'application/json',
        //'Authorization': 'token $value'
      },
    );
    if (response.statusCode == 200) {
      // If the server did return a 200 OK response,
      return Location.fromJson(json.decode(response.body));
    } else {
      // then throw an exception.
      throw Exception('Failed to load album');
    }
  }

**This is the second future that returns a List of weather that depends on location id from the first future *Lastlocation()

 Future<List> Getweither(String ID) async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'token';
    final value = prefs.get(key) ?? 0;

    String myUrl = "$serverUrl/dashbaord/Getweither/$ID?token=" + value;
    http.Response response = await http.get(myUrl,
        headers: {
          'Accept': 'application/json',
        });
    print("myUrldevice :"+myUrl);
    print("status :"+response.statusCode.toString());

    return json.decode(response.body);
  }

This is my class Location

// To parse this JSON data, do
//
//     final location = locationFromJson(jsonString);

import 'dart:convert';

List<Location> locationFromJson(String str) => List<Location>.from(json.decode(str).map((x) => Location.fromJson(x)));

String locationToJson(List<Location> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Location {
  Location({
    this.automaticIrrigation,
    this.coordinates,
    this.createdDate,
    this.sensorIds,
    this.id,
    this.siteName,
    this.description,
    this.v,
  });

  bool automaticIrrigation;
  List<double> coordinates;
  DateTime createdDate;
  List<String> sensorIds;
  String id;
  String siteName;
  String description;
  int v;

  factory Location.fromJson(Map<String, dynamic> json) => Location(
    automaticIrrigation: json["AutomaticIrrigation"],
    coordinates: List<double>.from(json["Coordinates"].map((x) => x.toDouble())),
    createdDate: DateTime.parse(json["Created_date"]),
    sensorIds: List<String>.from(json["Sensor_ids"].map((x) => x)),
    id: json["_id"],
    siteName: json["SiteName"],
    description: json["Description"],
    v: json["__v"],
  );

  Map<String, dynamic> toJson() => {
    "AutomaticIrrigation": automaticIrrigation,
    "Coordinates": List<dynamic>.from(coordinates.map((x) => x)),
    "Created_date": createdDate.toIso8601String(),
    "Sensor_ids": List<dynamic>.from(sensorIds.map((x) => x)),
    "_id": id,
    "SiteName": siteName,
    "Description": description,
    "__v": v,
  };
}

and this is my homePage

import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sidebar_animation/Services/DataHelpers.dart';
import 'package:sidebar_animation/sidebar/sidebar_layout.dart';
import '../bloc.navigation_bloc/navigation_bloc.dart';
import 'package:sidebar_animation/constants.dart';
import 'package:flutter/gestures.dart';
import 'package:sidebar_animation/bloc.navigation_bloc/navigation_bloc.dart';

class HomePage extends StatelessWidget with NavigationStates {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {


  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
   DatabaseHelper2 databaseHelper2 = new DatabaseHelper2();
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[100],
      body: ListView(
          FutureBuilder(
              future: databaseHelper2.Getweither(location_id),
              builder: (context,snapshot) {
                if (snapshot.hasError)
                {
                  print(snapshot.error);
                  print("there is problem !");
                }
                return snapshot.hasData
                    ?  ItemList(list: snapshot.data)
                    :  Center(child: CircularProgressIndicator(
                ),
                );
              }
),
    );
  }

  Widget _buildProgrammCard() {
    return Container(
        height: 90,
       child:
            Card(
              semanticContainer: true,
              clipBehavior: Clip.antiAliasWithSaveLayer,
              color: Colors.white,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(10.0),
              ),
              elevation: 4,
              margin: EdgeInsets.fromLTRB(14, 0, 14, 14),
              child:
              FutureBuilder(
                  future: databaseHelper2.Lastlocation(),
                  builder: (context,snapshot) {
                    if (snapshot.hasError)
                    {
                      print(snapshot.error);
                      print("mochkla lenaa *");
                    }
                    return snapshot.hasData
                        ?  Text("Location :" +snapshot.data.siteName)
                        :  Center(child: CircularProgressIndicator(
                    ),
                    );
                  }
              ),
            ),

    );

  }

class ItemList extends StatelessWidget{
  List list;
  ItemList({this.list});

  ScrollController _controller = new ScrollController();


  @override
  Widget build(BuildContext context) {
    return  ListView.builder(
      itemCount: list == null ? 0 : list.length,
      scrollDirection: Axis.horizontal,
      itemExtent: 190.0,
      itemBuilder: (context, index) {
        return Padding(
          padding: const EdgeInsets.fromLTRB(10, 0, 0, 14),
          child: Container(
            decoration: BoxDecoration(
              image: DecorationImage(
                image: NetworkImage(
                  item.storyUrl,
                ),
                fit: BoxFit.cover,
                colorFilter: ColorFilter.mode(
                  Colors.black26,
                  BlendMode.darken,
                ),
              ),
              borderRadius: BorderRadius.circular(10.0),
              color: Colors.grey,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.all(10.0),
                  child: Text(
                    "temp :",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                Padding(
                  padding: EdgeInsets.only(left: 24),
                  child:
                  Text(
                    list[i]['Weither']['Temp'],
                  ),
                ),
              ],
            ),
          ),
        );
      },
    ),

  }
}

Finally, I need to get the location id from the first future that returns the Location to the second future Getweither(String ID) to get the weather of a specified location.


Solution

  • Just nest the two FutureBuilders, and pass the snapshot.data as a parameter of the second one.

    Minimalistic example:

    FutureBuilder(
      future: databaseHelper2.Lastlocation(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          print(snapshot.error);
          print("there is problem !");
        }
       
        return snapshot.hasData
                        ?  FutureBuilder(
                             future: databaseHelper2.Getweither(snapshot.data.id),
                             builder: (context, snapshot2) {...})
                        :  Center(child: CircularProgressIndicator());
      } 
    );