Как я могу сбросить данные в более чем 2 текстовых поля одним предложением? [Трепещет]

#flutter #dart

Вопрос:

Я хочу автоматически заполнить несколько текстовых полей одним предложением, например: Если я выберу Вашингтон в качестве штата, в котором я живу, я хочу, чтобы другое поле, которое будет полем страны, заполнилось США.

Спасибо за ваше внимание!

Комментарии:

1. получите значение выбранного штата и извлеките соответствующее значение страны для выбранного значения штата из базы данных или из какого-либо другого места. заполните текстовое поле страны выбранным значением страны. это зависит от вашего дизайна программы

Ответ №1:

Вам нужно будет использовать setState( ) внутри onChanged . внутри этого setState вы измените значение другого поля otherDropdownValue . Вот небольшой пример с выпадающими списками.

Не забывайте, что вам нужно StatefulWidget (не StateLess )

Код:

 class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  String dropdownValue = 'One';
  String otherDropdownValue = 'Two';

  @override Widget build(BuildContext context) {
    return Column(children: [
        DropdownButton<String>(
          value: dropdownValue,
          onChanged: (String? newValue) {
            //******************************************
            //*****Here is what you are looking for*****
            //******************************************
            setState(() {
              dropdownValue = newValue;
              otherDropdownValue = newValue; ///Changes the other one
            });
            },
          items: <String>['One', 'Two', 'Free', 'Four'].map<DropdownMenuItem<String>>((String value) {
            return DropdownMenuItem<String>(value: value, child: Text(value),);}).toList(),
        ),
      DropdownButton<String>(
        value: otherDropdownValue,
        onChanged: (String? newValue) {
          setState(() {
            otherDropdownValue = newValue; 
          });
        },
        items: <String>['One', 'Two', 'Free', 'Four'].map<DropdownMenuItem<String>>((String value) {
          return DropdownMenuItem<String>(value: value, child: Text(value),);}).toList(),
      ),
      ],
    );
  }
}
 

Дайте мне знать, если это не поможет?

ОТРЕДАКТИРУЙТЕ, чтобы ответить на ваш последний комментарий:

Та же логика применима и к a TextField или a textformfield . Вам нужно будет добавить a TextEditingController() для управления отображаемым текстом. Ниже приведен полностью рабочий пример (часть, на которую вам нужно посмотреть, находится в конце)

и вот ссылка, объясняющая код (обратите внимание, что я скорректировал код для вашего конкретного случая использования)

https://flutter.dev/docs/cookbook/forms/text-field-changes

 import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Retrieve Text Input',
      home: MyCustomForm(),
    );
  }
}

// Define a custom Form widget.
class MyCustomForm extends StatefulWidget {
  const MyCustomForm({Key? key}) : super(key: key);

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

// Define a corresponding State class.
// This class holds data related to the Form.
class _MyCustomFormState extends State<MyCustomForm> {
  // Create a text controller and use it to retrieve the current value
  // of the TextField.
  final myController = TextEditingController();

  @override
  void initState() {
    super.initState();

    // Start listening to changes.
    myController.addListener(_printLatestValue);
  }

  @override
  void dispose() {
    // Clean up the controller when the widget is removed from the widget tree.
    // This also removes the _printLatestValue listener.
    myController.dispose();
    super.dispose();
  }

  void _printLatestValue() {
    print('Second text field: ${myController.text}');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Retrieve Text Input'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ///********************
            ///**** LOOK HERE  ****
            ///********************
            TextField(
              onChanged: (text) {
                myController.text = text;
              },
            ),
            TextField(
              controller: myController,
            ),
          ],
        ),
      ),
    );
  }
}
 

Комментарии:

1. Я действительно ценю ваше внимание, но, по-моему, я плохо объяснился. Спасибо за ваш ответ!

2. Можете ли вы описать, что именно вам нужно? Рад помочь

3. тебе все еще это нужно?

4. Хорошо, на самом деле, подумав некоторое время, я понял, что это действительно умно, просто мне это нужно в текстовом поле.

5. Конечно. Я отредактировал свой предыдущий ответ и привел полностью рабочий пример. Надеюсь, это закроет этот вопрос?