簡體   English   中英

Flutter 帶有 Getx 的 DropdownButton 小部件

[英]Flutter DropdownButton widget with Getx

我正在學習 GetX state 管理並偶然發現了 DropdownButton 小部件。 無法觀察到如何使用所選值更新所選值。 這是我的 DropdownButton 小部件

              DropdownButton(
                  hint: Text(
                    'Book Type',
                  ),
                  onChanged: (newValue) {
                    print(newValue);
                  },
                  value: selectedType,
                  items: bookController.listType.map((selectedType) {
                    return DropdownMenuItem(
                      child: new Text(
                        selectedType,
                      ),
                      value: selectedType,
                    );
                  }).toList(),
                ),

var selectedType;

在小部件構建中聲明。 我試圖使這個變量可觀察,但布局會引發溢出錯誤。 我也用 obx 包裝了這個小部件,但它仍然拋出了同樣的錯誤。 這個小部件究竟是如何使用 GetX 實現的。 我在這里拉頭發。 我可以使用 getX 處理其他小部件。

首先創建您的 controller class。

class BookController extends GetxController {

   // It is mandatory initialize with one value from listType
   final selected = "some book type".obs;

   void setSelected(String value){
     selected.value = value;
   }

}

在視圖上,實例化您的 Controller 並使用 Obx 小部件包裝 DropdownButton:

    BookController bookcontroller = BookController();
    
    Obx( () => DropdownButton(
                      hint: Text(
                        'Book Type',
                      ),
                      onChanged: (newValue) {
                        bookController.setSelected(newValue);
                      },
                      value: bookController.selected.value,
                      items: bookController.listType.map((selectedType) {
                        return DropdownMenuItem(
                          child: new Text(
                            selectedType,
                          ),
                          value: selectedType,
                        );
                      }).toList(),
                    )
),

如果您不想使用可觀察變量,請使用 getBuilder 包裝您的下拉列表並在 onChange function 中更新您的 controller 就像

               onChanged: (newValue) {
                     bookController.currentDropdownValue=newValue;
                    bookController.update();
                  },

例子

//Controller
class HomeController extends GetxController {
 var selectedDrowpdown = 'abc';
 List dropdownText = ['abc', 'def', 'ghi'];
  }
    //dropdown button in Ui 
  DropdownButton(
    hint: Text(
      'Book Type',
    ),
    onChanged: (newValue) {
      homeController.selectedDrowpdown=newValue;
      homeController.update();
    },
    value: homeController.selectedDrowpdown,
    items: [
      for (var data in homeController.dropdownTextList)
        DropdownMenuItem(
          child: new Text(
            data,
          ),
          value: data,
        )
    ])

我想指出,我的答案基於我當前的用例,其他答案是有效的,但不適用於我的用例,所以我想分享我的修復給想要使用它的人

on Controller 
String selectedWallet = "";

@override
  Future<void> onInit() async {
    super.onInit();
    fillSelectedWallet();
  }

fillSelectedWallet() {
    if (walletCntrl.walletList.isNotEmpty) {
      selectedWallet = walletCntrl.walletList[0].walletName;
    }
  }

在用戶界面上

DropdownButton<String>(
                        icon: const Icon(
                          Icons.arrow_drop_down_outlined,
                          color: Colors.black,
                        ),
                        iconSize: 22.h,
                        style:
                            styleHeadLine.copyWith(fontSize: setFontSize(16)),
                        underline: Container(
                          height: 0.0,
                          color: Colors.transparent,
                        ),
                        onChanged: (String? newValue) {
                          setState(() {
                            pieData.setWallet(newValue!);
                            pieData.update();
                          });
                        },
                        value: pieData.pieMainWallet,
                        items: walletData.walletList
                            .map((e) => e.walletName)
                            .map<DropdownMenuItem<String>>((String newMode) {
                          return DropdownMenuItem<String>(
                            child: Text(newMode),
                            value: newMode,
                          );
                        }).toList(),
                      ),

到目前為止有什么區別?? 差異基於無法接受 RxString 的下拉菜單項的值我嘗試將轉換 controller.selectedvalue 作為字符串但無法使其工作那么為什么我仍然使用 setState 而不是 getBuilder? 我已經使用 getBuilder 但下拉菜單 dsnt 中的文本項想要更改,因為上帝知道為什么,值更改但不是 UI

因此,如果它可以正常工作,如果有人想改進,請隨時在下面發表評論

final selected = "".obs;

BookController bookcontroller = BookController();
    
Obx( () => DropdownButton(
                  hint: Text(
                    'Book Type',
                  ),
                  onChanged: (newValue) {
                    bookController.setSelected(newValue);
                  },
                  value: bookController.selected.value==""?null:bookController.selected.value,
                  items: bookController.listType.map((selectedType) {
                    return DropdownMenuItem(
                      child: new Text(
                        selectedType,
                      ),
                      value: selectedType,
                    );
                  }).toList(),
                )
),

試試這個,這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM