ฉันจะระบุค่าเริ่มต้นให้กับช่องข้อความได้อย่างไร


144

ฉันต้องการระบุค่าเริ่มต้นให้กับช่องข้อความและวาดใหม่ด้วยค่าว่างเพื่อล้างข้อความ วิธีที่ดีที่สุดในการใช้ API ของ Flutter คืออะไร

คำตอบ:


105

(จากรายชื่อส่งเมลฉันไม่ได้คำตอบนี้)

class _FooState extends State<Foo> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: 'Initial value');
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new TextField(
          // The TextField is first built, the controller has some initial text,
          // which the TextField shows. As the user edits, the text property of
          // the controller is updated.
          controller: _controller,
        ),
        new RaisedButton(
          onPressed: () {
            // You can also use the controller to manipuate what is shown in the
            // text field. For example, the clear() method removes all the text
            // from the text field.
            _controller.clear();
          },
          child: new Text('CLEAR'),
        ),
      ],
    );
  }
}

ฉันเดาว่าเซิร์ฟเวอร์คำใบ้มีจุดประสงค์เดียวกัน
dhuma1981

3
แค่สงสัยว่ารายชื่ออีเมลใดที่คุณอ้างถึงในคำตอบ?
stt106

2
และเราจะผนวก / แทนที่ค่าฟิลด์ข้อความเป็นค่าเริ่มต้นได้อย่างไร?
Stuckedoverflow

2
นอกจากนี้อย่าลืมทิ้ง _controller บนวิดเจ็ตทิ้ง ขอแนะนำโดย Google ช่วยให้มั่นใจได้ว่าทรัพยากรจะถูกปลดปล่อยเมื่อไม่จำเป็น
Amrit Pal Singh

90

คุณสามารถใช้TextFormFieldแทนTextFieldและใช้initialValueคุณสมบัติ ตัวอย่างเช่น

TextFormField(initialValue: "I am smart")

2
ด้วยเหตุผลบางประการฉันไม่สามารถใช้สิ่งนี้กับวัตถุไดนามิกได้ ลงเอยด้วยการต้องการตัวควบคุม
S1r-Lanzelot

6
สิ่งนี้ใช้ได้เฉพาะเมื่อไม่ได้ระบุคอนโทรลเลอร์ด้วย TextFormField docs.flutter.io/flutter/material/TextFormField/…
Alex Fallenstedt

1
@AlexFallenstedt ไม่จำเป็นต้องมีคุณสมบัตินี้เมื่อมีคอนโทรลเลอร์
Sami Kanafani

ฉันคิดว่านี่มีความเสี่ยงเพราะเมื่อสร้างแผนผังวิดเจ็ตของคุณขึ้นใหม่ข้อความของคุณสามารถแทนที่ด้วยค่าเริ่มต้นได้
GökberkYağcı

48

คุณไม่จำเป็นต้องกำหนดตัวแปรแยกต่างหากในขอบเขตวิดเจ็ตเพียงทำแบบอินไลน์:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)

จุดคู่ใน "TextEditingController () .. text" หมายถึงอะไร?
Ray Li

3
@RayLi เรียกว่า cascade operator ดูข้อมูลและตัวอย่างได้ที่นี่stackoverflow.com/questions/53136945/…
vovahost

1
ขอบคุณ !. เหมาะสำหรับการสร้างวิดเจ็ตแบบไดนามิกจากรายการวัตถุ :)
davaus

นี่คือสิ่งที่ฉันกำลังมองหา !! ขอบคุณมาก!
TaeJung Shim

1
@vovahost มันขาดส่วนที่ทิ้งไปอย่างน่าเสียดาย
Chris Rutkowski

28

หากคุณใช้TextEditingController ให้ตั้งค่าข้อความเป็นดังด้านล่าง

TextEditingController _controller = new TextEditingController();


_controller.text = 'your initial text';

final your_text_name = TextFormField(
      autofocus: false,
      controller: _controller,
      decoration: InputDecoration(
        hintText: 'Hint Value',
      ),
    );

และหากคุณไม่ได้ใช้TextEditingControllerคุณสามารถใช้initialValueได้โดยตรงตามด้านล่าง

final last_name = TextFormField(
      autofocus: false,
      initialValue: 'your initial text',
      decoration: InputDecoration(
        hintText: 'Last Name',
      ),
    );

สำหรับการอ้างอิงเพิ่มเติมTextEditingController


ฉันไม่แน่ใจว่าควรตั้งค่าเริ่มต้นให้กับtextคุณสมบัติตามเอกสารTextEditingController.textคุณสมบัติหรือไม่: การตั้งค่านี้จะแจ้งให้ผู้ฟังทั้งหมดของ TextEditingController นี้ทราบว่าพวกเขาจำเป็นต้องอัปเดต (เรียกว่า alertListeners) ด้วยเหตุนี้ควรกำหนดค่านี้ระหว่างเฟรมเท่านั้นเช่นเพื่อตอบสนองต่อการกระทำของผู้ใช้ไม่ใช่ระหว่างขั้นตอนการสร้างเค้าโครงหรือขั้นตอนการระบายสี ( api.flutter.dev/flutter/widgets/TextEditingController/text.html )
Kirill Karmazin

16

ฉันเห็นหลายวิธีในการทำสิ่งนี้ที่นี่ อย่างไรก็ตามฉันคิดว่านี่มีประสิทธิภาพมากกว่าหรืออย่างน้อยก็รวบรัดกว่าคำตอบอื่น ๆ

TextField(
   controller: TextEditingController(text: "Initial Text here"),
)

7

หากคุณต้องการจัดการหลายตัวTextInputตามที่ @MRT ถามในความคิดเห็นสำหรับคำตอบที่ยอมรับคุณสามารถสร้างฟังก์ชันที่รับค่าเริ่มต้นและส่งกลับค่าTextEditingControllerดังนี้:

initialValue(val) {
  return TextEditingController(text: val);
}

จากนั้นตั้งค่าฟังก์ชันนี้เป็นตัวควบคุมสำหรับTextInputและระบุค่าเริ่มต้นดังนี้:

controller: initialValue('Some initial value here....')

คุณสามารถทำซ้ำสิ่งนี้สำหรับTextInputs อื่น ๆ


5

สิ่งนี้สามารถทำได้โดยใช้TextEditingController.

คุณสามารถเพิ่มค่าเริ่มต้นได้

TextEditingController _controller = TextEditingController(text: 'initial value');

หรือ

หากคุณใช้TextFormFieldคุณมีinitialValueทรัพย์สินที่นั่น ซึ่งโดยพื้นฐานแล้วจะให้สิ่งนี้initialValueแก่คอนโทรลเลอร์โดยอัตโนมัติ

TextEditingController _controller = TextEditingController();
TextFormField(
  controller: _controller,
  initialValue: 'initial value'
)

หากต้องการล้างข้อความคุณสามารถใช้ _controller.clear()วิธีการ


3

ภายในชั้นเรียน

  final usernameController = TextEditingController(text: 'bhanuka');

ช่องข้อความ,

   child: new TextField(
        controller: usernameController,
    ...
)


-12

หากคุณไม่พบคำตอบสำหรับสิ่งนี้และสำหรับผู้ที่มาที่นี่เพื่อหาคำตอบ: ชำระเงินInputDecorationhintText ของฟิลด์:

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...

ข้อความคำใบ้ไม่ใช่ค่าเริ่มต้น เมื่อผู้ใช้พิมพ์บางสิ่งก็จะหายไป ข้อความเริ่มต้นก็เหมือนกับการเขียนบางอย่างล่วงหน้าสำหรับผู้ใช้
Arman Ordookhani

นี่คือข้อความคำแนะนำ Not Value initialiser
MRT

2
นั่นเป็นเรื่องจริง แต่นี่เป็นสิ่งที่ดีสำหรับผู้ที่มาที่นี่โดยมองหาข้อความคำใบ้ แต่ไม่รู้ว่าจะเรียกว่าอะไร
ThinkDigital
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.