Я хотел бы отображать другой значок в зависимости от кода HTTP (200, 400), полученного во время вызова API. В начале каждого ListTile я вызываю асинхронную функцию iconExchange.

И я получаю сообщение об ошибке: «Тип аргумента 'Future ' Не может быть назначен типу параметра 'Widget?'».

Небольшое уточнение: ListTile находится в переменной с именем listParametres.

enter image description here

class ApiExchangesPage extends StatelessWidget {
  final User? user;
  final DocumentSnapshot? member;
  const ApiExchangesPage({Key? key, required this.user, this.member})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    final listParametres = [
      Column(children: [
        ListTile(
          onTap: () {
            print(ftx.titleDatabase);
            Navigator.push(context, MaterialPageRoute(builder: (_) {
              return ExchangeConnectScreen(user: user, exchange: ftx);
            }));
          },
          leading: iconExchange(ftx),
          title: Text(
            "FTX",
            style: TextStyle(color: Colors.white),
          ),
          trailing: Icon(
            Icons.arrow_right,
            color: Colors.white,
          ),
        ),
        ListTile(
          onTap: () {
            Navigator.push(context, MaterialPageRoute(builder: (_) {
              return ExchangeConnectScreen(
                user: user,
                exchange: binance,
              );
            }));
          },
          leading: iconExchange(binance),
          title: Text(
            "Binance Future",
            style: TextStyle(color: Colors.white),
          ),
          trailing: Icon(
            Icons.arrow_right,
            color: Colors.white,
          ),
        ),
        ListTile(
          onTap: () {
            Navigator.push(context, MaterialPageRoute(builder: (_) {
              return ExchangeConnectScreen(
                user: user,
                exchange: bybit,
              );
            }));
          },
          leading: iconExchange(bybit),
          title: Text(
            "Bybit",
            style: TextStyle(color: Colors.white),
          ),
          trailing: Icon(
            Icons.arrow_right,
            color: Colors.white,
          ),
        ),
        ListTile(
          onTap: () {
            Navigator.push(context, MaterialPageRoute(builder: (_) {
              return ExchangeConnectScreen(
                user: user,
                exchange: bitmex,
              );
            }));
          },
          leading: iconExchange(bitmex),
          title: Text(
            "Bitmex",
            style: TextStyle(color: Colors.white),
          ),
          trailing: Icon(
            Icons.arrow_right,
            color: Colors.white,
          ),
        ),
      ])
    ];
    return Scaffold(
      backgroundColor: backgroundColor,
      appBar: MyAppBar(
        title: "Exchanges",
      ),
      body: ListView.separated(
          itemBuilder: (context, index) {
            return listParametres[index];
          },
          separatorBuilder: (context, index) {
            return Divider(
              color: Colors.white,
            );
          },
          itemCount: listParametres.length),
    );
  }

  Future<int> appelBDD(Exchange exchange) async {
    var member = await FirebaseFirestore.instance
        .collection('member')
        .doc(user?.uid)
        .get();
    print(member);

    if (member.data()![exchange] != null) {
      List pa = await member.data()?[exchange] ?? [""];

      int code = await TestApiClass()
          .appelApi(exchange, pa[0].toString(), pa[1].toString());
      print(code);
      return code;
    }
    return 0;
  }

  Future<Widget?> iconExchange(Exchange exchange) async {
    var appel = await appelBDD(exchange);
    print(exchange.titleDatabase);
    print(appel);

    if (appel == 200) {
      return Icon(
        Icons.check_circle,
        color: Colors.green,
      );
    } else {
      return Icon(
        Icons.dangerous_rounded,
        color: Colors.red,
      );
    }
  }
}

Спасибо заранее за вашу помощь.

1
Wizeep 21 Ноя 2021 в 14:04

1 ответ

Лучший ответ

Вам следует использовать специальный виджет FutureBuilder: https: // api. flutter.dev/flutter/widgets/FutureBuilder-class.html

Таким образом у вас будет другой значок:

  • когда делается запрос (загрузка)
  • запрос не выполняется
  • запрос выполнен успешно

Пример использования:

FutureBuilder<Album>(
  future: futureAlbum,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data!.title);
    } else if (snapshot.hasError) {
      return Text('${snapshot.error}');
    }

    // By default, show a loading spinner.
    return const CircularProgressIndicator();
  },
)
1
Jscti 21 Ноя 2021 в 14:08