Невозможно использовать данные, поступающие из параметров в функции Future - PullRequest
0 голосов
/ 06 августа 2020

У меня страница отправляет данные в качестве параметра на другую страницу, вторая страница получает аргументы внутри (сборка виджета (контекст BuildContext)), поэтому функция Future находится в начале класса страницы, например этот код:

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

class Days extends StatefulWidget {
  @override
  _DaysState createState() => _DaysState();
}

class _DaysState extends State<Days> {
  var cm_id;
  var d_id;
  var w_id;
  var u_id;
  Map rdata = {};
  Map data = {};
  List digrees;
  Future getDigrees() async {
    var url = 'http://10.0.2.2/jiyan/test/api/digrees/day_digree.php?u_id=' +
        u_id +
        '&m_id=' +
        cm_id +
        '&d_id=' +
        d_id;
    var response = await http.get(url);
    data = jsonDecode(response.body);
  }
  @override
  void initState() {
    super.initState();
    getDigrees();
  }
  @override
  Widget build(BuildContext context) {
    rdata = ModalRoute.of(context).settings.arguments;
    setState(() {
      cm_id = int.parse(rdata['current_m_id'].toString());
      d_id = int.parse(rdata['d_id'].toString());
      w_id = int.parse(rdata['w_id'].toString());
      u_id = int.parse(rdata['u_id'].toString());
    });
    return Scaffold()

Теперь функция не может получать эти данные, как я могу это сделать?

1 Ответ

1 голос
/ 07 августа 2020
  1. Вы не должны помещать все как переменную-член в состояние. Постарайтесь как можно больше использовать внедрение зависимостей (помещая все, что вам нужно в качестве аргументов метода).

  2. Конкатенация строк в Dart выполняется легко с помощью $ like:

int a = 5;
int b = 10;
String result = "$a + $b = ${a+b}";
Вот код, который я бы предложил:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class Days extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: fetchDigrees(context),
      builder: (context, snapshot) {
        if (snapshot.connectionState != ConnectionState.done) {
          return Center(
            child: Text("Loading...."),
          );
        }

        List digrees = snapshot.data;

        return Text(digrees.length.toString());
      },
    );
  }

  Future<List> fetchDigrees(BuildContext context) async {
    Map rdata = ModalRoute.of(context).settings.arguments;

    int cm_id = int.parse(rdata['current_m_id'].toString());
    int d_id = int.parse(rdata['d_id'].toString());
    int w_id = int.parse(rdata['w_id'].toString());
    int u_id = int.parse(rdata['u_id'].toString());

    var url =
        'http://10.0.2.2/jiyan/test/api/digrees/day_digree.php?u_id=$u_id&m_id=$cm_id&d_id=$d_id';
    var response = await http.get(url);
    var data = jsonDecode(response.body);

    return data["digrees"]; //or however you have to extract this from the json
  }
}

...