iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
生成式 AI

用AI寫程式也是要點本事的系列 第 26

新的UI!DropdownButton!

  • 分享至 

  • xImage
  •  

因應新的功能,開始設計新的UI。

目前專案的狀況是「關鍵功能無法在client端完成」,但疑似有找到使用第三方API完成的可能性。
這種情況下,專案的進行目標就可以彈性的修改,「A團隊開始測試第三方API並找出正確的使用方式」「B團隊開始繼續設計新的介面」。這就是我現在採行的方式,雖然「A團隊」與「B團隊」最終都是我一個人....

「請在main功能的介面上新增一個Spinner,裡面有兩個選項:『文字」與『間隔』,將Spinner放在文字輸入匡的上方。」

給我的答案有點傻眼...


class _MyHomePageState extends State<MyHomePage> {
  // ...
  String dropdownValue = '文字'; // 新增一個變數來儲存目前選擇的值

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ...
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            DropdownButton<String>( // 新增一個 DropdownButton
              value: dropdownValue,
              icon: const Icon(Icons.arrow_downward),
              iconSize: 24,
              elevation: 16,
              style: const TextStyle(color: Colors.deepPurple),
              underline: Container(
                height: 2,
                color: Colors.deepPurpleAccent,
              ),
              onChanged: (String? newValue) {
                setState(() {
                  dropdownValue = newValue!;
                });
              },
              items: <String>['文字', '間隔']
                .map<DropdownMenuItem<String>>((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                })
                .toList(),
            ),
            // ...
          ],
        ),
      ),
      // ...
    );
  }
}

這個介面不用測試,看就知道不對。

「放在輸入匡的上方,不是整個介面置頂。」


class _MyHomePageState extends State<MyHomePage> {
  // ...
  String dropdownValue = '文字'; // 新增一個變數來儲存目前選擇的值

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ...
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            DropdownButton<String>( // 新增一個 DropdownButton
              value: dropdownValue,
              icon: const Icon(Icons.arrow_downward),
              iconSize: 24,
              elevation: 16,
              style: const TextStyle(color: Colors.deepPurple),
              underline: Container(
                height: 2,
                color: Colors.deepPurpleAccent,
              ),
              onChanged: (String? newValue) {
                setState(() {
                  dropdownValue = newValue!;
                });
              },
              items: <String>['文字', '間隔']
                .map<DropdownMenuItem<String>>((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                })
                .toList(),
            ),
            // ...
          ],
        ),
      ),
      // ...
    );
  }
}

這次的對了。

那來追加一個要求...
「Spinner選擇「文字」時,文字輸入匡提示文字顯示「請輸入文字」。Spinner選擇「間隔」時,文字輸入匡提示文字顯示「請輸入間隔時間長度。(單位為秒)」。」

AI有特別說明:
「在 Flutter 中,我們可以使用 TextEditingController 的 text 屬性來設定 TextField 的提示文字。當 DropdownButton 的值改變時,我們可以更新 TextEditingController 的 text 屬性。」


              onChanged: (String? newValue) {
                setState(() {
                  dropdownValue = newValue!;
                  if (dropdownValue == '文字') {
                    textController.text = '請輸入文字';
                  } else if (dropdownValue == '間隔') {
                    textController.text = '請輸入間隔時間長度。(單位為秒)';
                  }
                });
              },

雖然有些小錯誤或說需要補充的修正的地方,但基本上這段功能是可以正常運行的...誒誒誒!錯了!
AI沒搞懂「提示文字」,而是直接把「提示文字」當成輸入文字了!

直接告訴它:「textController.text = '請輸入文字'; 請將這裡改為「設定提示文字」而不是「設定輸入文字」。」


TextField(
  controller: textController,
  decoration: InputDecoration(
    hintText: dropdownValue == '文字' ? '請輸入文字' : '請輸入間隔時間長度。(單位為秒)',
  ),
),

至於「textController.text」的地方呢?程式碼先自己手動拿掉了。
再追加一個條件...
「可否判斷dropdownValue之內容來限定可以輸入的資料種類。如果是「間隔」時只能輸入數字。」


TextField(
  controller: textController,
  decoration: InputDecoration(
    hintText: dropdownValue == '文字' ? '請輸入文字' : '請輸入間隔時間長度。(單位為秒)',
  ),
  inputFormatters: dropdownValue == '間隔' ? <TextInputFormatter>[
    FilteringTextInputFormatter.digitsOnly // 只允許輸入數字
  ] : <TextInputFormatter>[],
),

記得測試....測試通過!


上一篇
再嘗試一個套件 : flutter_ffmpeg
下一篇
按照Spinner的選項內容新增不同的資料
系列文
用AI寫程式也是要點本事的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言