как перейти из состояния объекта в объект, а затем передать его на другой экран

#flutter #android-studio #dart

#flutter #android-studio #dart

Вопрос:

Мне нужна ваша помощь, сначала у меня есть две страницы, обе они являются виджетами с отслеживанием состояния, одна из них — главный экран, на 2-й странице есть данные, и я хочу передать их на главный экран

главная страница

code

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

class _PriceScreenState extends State<PriceScreen> {

  String selectedCurrency = 'USD';

  String bitcoinValueInUSD;

  int dropNumber;

  void getCurrenciesBitcoin() async {

    try {
      CoinData coinData = CoinData();

      double usdPrice = await coinData.getCurrencies();

      setState(() {
        bitcoinValueInUSD = usdPrice.toStringAsFixed(0);
      });
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    getCurrenciesBitcoin();

    return Scaffold(
      appBar: AppBar(
        title: Text('🤑 Coin Ticker'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.fromLTRB(18.0, 18.0, 18.0, 0),
            child: Card(
              color: Colors.lightBlueAccent,
              elevation: 5.0,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(10.0),
              ),
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 28.0),
                child: Text(
                  '1 BTC = $bitcoinValueInUSD $selectedCurrency',
                  textAlign: TextAlign.center,
                  style: TextStyle(
                    fontSize: 20.0,
                    color: Colors.white,
                  ),
                ),
              ),
            ),
          ),
          Container(
            height: 150.0,
            alignment: Alignment.center,
            padding: EdgeInsets.only(bottom: 30.0),
            color: Colors.lightBlue,
            child: GetDropDownMenu(
              selectedCurrency: ,
            ),
          ),
        ],
      ),
    );
  }
}
 

и это вторая страница

 class GetDropDownMenu extends StatefulWidget {
  
  @override
  _GetDropDownMenuState createState() => _GetDropDownMenuState();
}

class _GetDropDownMenuState extends State<GetDropDownMenu> {
  String selectedCurrency;

  List<DropdownMenuItem<String>> getDropDownItem() {
    List<DropdownMenuItem<String>> dropDownItems = [];

    for (String currency in currenciesList) {
      var newItem = DropdownMenuItem(
        child: Text(currency),
        value: currency,
      );
      dropDownItems.add(newItem);
    }
    return dropDownItems;
  }

  @override
  Widget build(BuildContext context) {
    return DropdownButton<String>(
        value: selectedCurrency,
        items: getDropDownItem(),
        onChanged: (value) {
          setState(() {
            selectedCurrency = value;
          });
        });
  }
}
 

мне нужно передать значение selectedCurrency со 2-й страницы на главную страницу, чтобы оно было равно переменной selectedCurrency там

Ответ №1:

Вы можете добавить функцию обратного вызова в конструктор, чтобы вернуть выпадающее значение.

Например

 class GetDropDownMenu extends StatefulWidget {
  final Function(String) onSubmitted;

  const GetDropDownMenu({Key key, this.onSubmitted}) : super(key: key);

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

class _GetDropDownMenuState extends State<GetDropDownMenu> {
  String selectedCurrency;

  @override
  Widget build(BuildContext context) {
    return DropdownButton<String>(
        value: selectedCurrency,
        items: getDropDownItem(),
        onChanged: (value) {
          setState(() {
            selectedCurrency = value;
          });
          widget.onSubmitted(value);
        });
  }
}
 

Как использовать:

 GetDropDownMenu(
  onSubmitted: (val) {
    print("Result value on dropdown: $val");
  },
)
 

Ответ №2:

Самый простой способ:

1. С 1-го экрана перейдите к другим, как:

     Navigator.pushNamed(context, "second",arguments: selectedCurrency);
    },
 

2. На втором экране в build методе get как :

 @override
  Widget build(BuildContext context) {
    var passedValue = ModalRoute.of(context).settings.arguments;
    return Scaffold(
      appBar: AppBar(title: Text("Second")),
      body: Container(
        child: Column(
          children: <Widget>[
            Text("PassedValue : $passedValue"),
          ],
        ),
      ),
    );
}
 

Надеюсь, это будет полезно