Flutter Getx — отправка данных на другие страницы

avatar
regenin
1 июля 2021 в 19:23
1203
2
-1

Как я могу отправить данные, полученные от API, на другие страницы? До использования getx я отправлял с помощью «widget.bla bla», но теперь я не знаю, как я могу его отправить.

class HomePage extends StatelessWidget {
  final AllCoinController allCoinController = Get.put(AllCoinController());
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Obx(
            () => ListView.builder(
              scrollDirection: Axis.vertical,
              itemCount: allCoinController.coinList.length,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: GestureDetector(
                    onTap: () {
                      Get.to(CoinContent());
                    },
                    child: Container(
                      color: Colors.grey[700],
                      width: 150,
                      child: Row(
                        children: [
                          SizedBox(
                            width: 50,
                            height: 50,
                            child: Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: Image.network(
                                  allCoinController.coinList[index].image),
                            ),
                          ),
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(allCoinController.coinList[index].name),
                          ),
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(allCoinController.coinList[index].symbol),
                          ),
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Text(allCoinController
                                .coinList[index].currentPrice
                                .toString()),
                          ),
                        ],
                      ),
                    ),
                  ),
                );
              },
            ),
          ),
        );
      }
    }

Страница, на которую я хочу отправить данные:

class CoinContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("coin name"),
      ),
      body: Obx(
        () => Center(
          child: Column(
            children: [
              Text("coin data 1"),
              Text("coin data 2"),
              Text("coin data 3"),
              Text("coin data 4"),
              Text("coin data 5"),
              Text("coin data 6"),
            ],
          ),
        ),
      ),
    );
  }
}

И мои последние коды вопросов не находятся автоматически при использовании Getx. Пример:

Text(allCoinController.coinList[index].currentPrice.toString()),
              

Я получаю те же данные без использования getx, и проблем не возникает. Но при использовании Getx код "currentPrice" автоматически не находится и не отображается. Мне нужно скопировать код для записи.

Мой контроллер:

import 'dart:async';
import 'package:coin_finder/models/btc_eth_bnb_model.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;

class AllCoinController extends GetxController {
  var coinList = [].obs;

  final url = Uri.parse("api url")    
  Future callAllCoins() async {
    try {
      final response = await http.get(url);

      if (response.statusCode == 200) {
        List<dynamic> values = [];
        values = allCoinsFromJson(response.body);
        coinList.assignAll(values);

        if (values.length > 0) {
          for (int i = 0; i < values.length; i++) {
            if (values[i] != null) {
              coinList.add(values[i]);
            }
          }
        }
        return coinList;
      } else {
        print(response.statusCode);
      }
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  void onInit() {
    callAllCoins();
    Timer.periodic(Duration(minutes: 5), (timer) => callAllCoins());
    super.onInit();
  }
}

Модель:

import 'dart:convert';

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

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

class AllCoins {
  AllCoins({
    required this.symbol,
    required this.name,
    required this.image,
    required this.currentPrice,
  });

  String symbol;
  String name;
  String image;
  num currentPrice;

  factory AllCoins.fromJson(Map<String, dynamic> json) => AllCoins(
        symbol: json["symbol"],
        name: json["name"],
        image: json["image"],
        currentPrice: json["current_price"],
      );

  Map<String, dynamic> toJson() => {
        "symbol": symbol,
        "name": name,
        "image": image,
        "current_price": currentPrice,
      };
}

Версия Dart: sdk: ">=2.12.0 <3.0.0"

Источник
Why_So_Ezz
1 июля 2021 в 20:23
0

вам не нужно делать ничего другого, вы можете передать его как: Get.to(CoinContent(data: data));.... если вы не хотите отправлять данные, вы можете напрямую найти контроллер, например: var allCoinController = Get.find<allCoinController>();

Ответы (2)

avatar
EL LORD GAMING
19 сентября 2021 в 16:33
0

в этом случае мы не используем agrs в конструкторе

вместо такой маршрутизации Get.to(MyScreen()); вы должны использовать Get.to(MyScreen(), arguments: [1,2,3]);

вы можете получить к ним доступ, используя Get.arguments, он должен вернуть список

Примечание. Аргументы не изменятся при использовании приложения, пока вы не переопределите их, перенаправив на другой экран с помощью args

.
avatar
Rai Rizwan
1 июля 2021 в 20:47
0
 in home page  Get.to(CoinContent(),arguments: 
allCoinController.coinList[index] )
//
class CoinContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final data = ModalRoute.of(context)!.settings.arguments as 
AllCoins;
return Scaffold(
  appBar: AppBar(
    centerTitle: true,
    title: Text("coin name"),
  ),
  body:Center(
      child: Column(
        children: [
          Text("${data.name}"),
        
        ],
      ),
    ),
 );
}
}