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

#flutter #dart #flutter-getx

Вопрос:

Как я могу отправить данные, полученные из 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()),
              
 

I get the same data without using getx and there was no problem. But when using Getx the «currentPrice» code is not automatically found and does not appear. I need to copy the code to write.

My controller:

 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 >

Комментарии:

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

Ответ №1:

  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}"),
        
        ],
      ),
    ),
 );
}
}
 

Ответ №2:

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

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

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

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