#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. Конечно. Я отредактировал свой предыдущий ответ и привел полностью рабочий пример. Надеюсь, это закроет этот вопрос?