如何在Column中更改子窗口小部件的位置?

时间:2020-08-14 11:23:33

标签: flutter dart

我需要更改窗口小部件在UI中的位置。但是我无法实现。

我尝试了此代码,但对我而言不起作用。如果有人知道该怎么做,请帮忙。

将BankCard小部件的位置更改为另一个BankCard小部件,或更改Column中任何小部件的位置。

下面您可以找到我尝试的代码:

Widget nonNullBody(List<GetConversionCards> cards) {
    _column=Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Text(
          "fromSum".tr(),
          style: TextStyle(
              fontSize: 16, fontWeight: FontWeight.w700),
          textAlign: TextAlign.left,
        ),
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: BankCard(
              card: Bank.CreditCardModel.fromUzCard(
                  cards[bloc.selectedIndex.value])),
        ),
        IconButton(
          icon: Icon(Icons.sync),
          onPressed: () {


            _key.currentState.setState(() {
              Widget t=_column.children[0];
              _column.children[0]=_column.children[3];
              _column.children[3]=t;
            });
          },
        ),
        Text("toVisa".tr(),
            style: TextStyle(
                fontSize: 16,
                fontWeight: FontWeight.w700),
            textAlign: TextAlign.left),
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: BankCard(
              card: Bank.CreditCardModel.fromVisaCard(
                  cards[bloc.selectedIndex.value])),
        ),
      ],);
    bloc.tokenCardUzs = cards[0].uzsCardId;
    final size = MediaQuery.of(context).size;
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 20),
      child: SingleChildScrollView(
        child: Container(
          height: size.height - appBar().preferredSize.height + 5,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              Container(
                height: 30,
                child: ValueListenableBuilder(
                    valueListenable: bloc.selectedIndex,
                    builder: (context, v, w) {
                      return ListView.builder(
                          scrollDirection: Axis.horizontal,
                          shrinkWrap: true,
                          itemCount: cards.length,
                          itemBuilder: (context, index) {
                            return Container(
                              width: 8.0,
                              height: 8.0,
                              margin: EdgeInsets.symmetric(
                                  vertical: 12.0, horizontal: 2.0),
                              decoration: BoxDecoration(
                                  shape: BoxShape.circle,
                                  color: bloc.selectedIndex.value == index
                                      ? Color.fromRGBO(0, 0, 0, 0.9)
                                      : Color.fromRGBO(0, 0, 0, 0.4)),
                            );
                          });
                    }),
              ),
              Flexible(
                fit: FlexFit.loose,
                flex: 5,
                child: PageView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: cards.length,
                    onPageChanged: (_) {
                      bloc.tokenCardUzs = cards[_].uzsCardId;
                      bloc.selectedIndex.value = _;
                    },
                    itemBuilder: (BuildContext context, int index) {
                      return StatefulBuilder(
                        key: _key,
                        builder: (BuildContext context,
                            void Function(void Function()) state) {
                          return _column; );
                    }),
              ),
              Flexible(
                child: TextFieldWidget(
                  controller: bloc.amountFieldController,
                  iconData: Icons.monetization_on,
                  validator: null,
                  hintText: "enterAmount".tr(),
                  labelText: "dollarCurrency".tr(),
                ),
              ),
              ConfirmButton(
                text: 'next'.tr(),
                onPressed: () {
                  showPopUp(context, () async {
                    Navigator.of(context, rootNavigator: true).pop();
                    waitTransactionWidget(context);

                    int usd =
                        (double.parse(bloc.amountFieldController.text) * 100)
                            .toInt();
                    bool result = await Repository.getInstance()
                        .convUzsUsd(bloc.tokenCardUzs, usd);
                    print("result conv $result");
                    Navigator.of(context, rootNavigator: true).pop();
                    Navigator.pushReplacement(
                        context,
                        PageTransition(
                            child: MyHomePage(),
                            type: PageTransitionType.fade));
                  },
                      title: Text("wouldYouLikeToExchange".tr()),
                      subtitle: Text("${bloc.amountFieldController.text} " +
                          "dollarCurrency".tr()));
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

1 个答案:

答案 0 :(得分:1)

我建议您创建一个包含小部件的列表,然后将其分配给Column的子级参数。因此,当您更改列表的内容时,它也会同时更改列。

像这样:

  List<Widget> list = new List();

  @override
  Widget build(BuildContext context) {
    Column(
      children: list,
    );
  }

  adjustWidgetList() {
    setState(() {
      list.add(Text("lorem ipsum"));
      list.add(Text("dolar sit amet."));
            .
            .
            .
      list.remove(0);
    });

  }

但是不要忘记在setState内进行更改。