Я хочу обновить данные по идентификатору, у меня есть идентификатор пользователя, имя и все данные, если я хочу изменить какие-либо данные пользователя на основе идентификатора пользователя, поэтому я не могу обновлять данные, и я получаю значения над полем текстовой формы. пожалуйста, проверьте мою функцию обновления данных и код и помогите, я новичок в флаттере.
Future<DataDetails> getDataa() async {
final response = await http.get(
Uri.parse("get url"));
if (response.statusCode == 200) {
var temp = DataDetails.fromJson(jsonDecode(response.body));
return temp;
}
return DataDetails.fromJson(jsonDecode(response.body)) ;
}
Future<DataDetails> updateData(String cardName,String name,String designation,String
company,String address,String email,String phone) async {
var edata = {
"id": '$id',
"cardName": cardName,
"name": name,
"designation": designation,
"company": company,
"address": address,
"email": email,
"phone": phone,
};
var ebody = jsonEncode(edata);
final response = await http.put(
Uri.parse('put url'),
body: ebody,
headers: {
'Content-Type': 'application/json-patch+json',
}
);
if (response.statusCode == 200) {
return DataDetails.fromJson(jsonDecode(response.body));
}
else {
throw Exception('Failed to update Data.');
}
}
приведенный выше код получает значение из БД и обновляет.
этот код я ввожу новое значение для обновления в БД, но в этом коде я не получаю старые значения внутри поля текстовой формы.
//initState
late Future<DataDetails> _futureData;
@override
void initState() {
super.initState();
_futureData = getDataa();
}
FutureBuilder(
future: _futureData,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('${snapshot.data!.cardName}'),
TextFormField(
controller: _cardnameController,
decoration: const InputDecoration(
hintText: 'Enter Card Name',
border: OutlineInputBorder()
),
),
//Update button call:
ElevatedButton(
onPressed: () {
setState(() {
_futureData = updateData(
_cardnameController.text,
_nameController.text,
_roleController.text,
_companyController.text,
_addressController.text,
_phoneController.text,
_emailController.text,
);
});
},
child: Text('Update'),
),
Я новичок в Flutter Пожалуйста, помогите, Спасибо
«Я не получаю старые значения в поле текстовой формы». как вы думаете, какой код это делает? Потому что я не вижу кода, помещающего что-либо в поле формы. Может быть, вы пропустили, чтобы опубликовать это?
Привет @HarshSureja Я попробовал initState, но он не работает. Если возможно, поделитесь одним примером кода для функций редактирования и обновления.
Привет @nvoigt, может быть, я пропустил кое-что, где я не знаю, где я сделал ошибку. поэтому, пожалуйста, направьте и предложите пример кода
Согласно вашему описанию, это значение не отображается в TextFormField
. Value
в TextFormField
управляется через контроллер, поэтому просто инициализируйте значение в initstate
как:
_cardnameController.text=cardname.toString;
да, теперь он работает после кода Aks. но после редактирования новое значение не обновляется в БД. он показывает "загрузка данных..." из кода.
Попробуй это...
FutureBuilder(
future: _futureData,
builder: (context, snapshot) {
if (snapshot.hasData) {
final data = snapshot.data as DataDetails;
//update the text of controller here
_controller.text = data.name;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(data.id.toString()),
TextFormField(
controller: _controller,
decoration: const InputDecoration(
hintText: 'Enter Card Name',
border: OutlineInputBorder()
),
)
],
);
}
return const Center(
child: Text("Loading data..."),
);
},
)
Привет, @Aks большое спасибо за работу, я получаю данные внутри поля текстовой формы, но после редактирования нового значения данных не обновляется в БД. не могли бы вы проверить мою функцию обновления? Я также добавлю код функции кнопки обновления, пожалуйста, помогите
конечно. просто покажи свой код
добавлены , кнопка обновления и код initState.
какой у вас тип _futureData?
Привет @Aks, я решил эту проблему, теперь она отлично работает с вашим кодом после редактирования обновления данных в БД. Большое спасибо, сэр, за вашу помощь и руководство
@ Спросите, у меня есть еще одно сомнение: как установить или создать профиль пользователя только один раз при первом запуске приложения после установки.
Это просто. Сохраните значение в локальной базе данных. на основе этого значения вы можете перейти на страницу регистрации или домашнюю страницу. При первом заполнении регистрационной формы сохраните значение в локальной базе данных. Затем в следующий раз, когда приложение будет запущено, получите это сохраненное значение и перейдите на домашнюю страницу.
Привет @Aks Спасибо, все работает. еще одно сомнение: я хочу получать и отображать данные из API. Я использую метод построителя будущего и построителя ListView. в этом я получаю только одну запись, в базе данных доступны 3 записи, отображающая только последнюю. если более 3 записей отображают пустую страницу.. если я делаю сжатиеWrap: true, эта 1 запись видна и сжатиеWrap: false, снова отображается пустая страница, как пустая. Я застрял здесь с последних 2 дней, пожалуйста, помогите
@Nihar, вы должны опубликовать еще один вопрос по этому поводу.
Привет @aks, вопрос опубликован, пожалуйста, проверьте и помогите stackoverflow.com/questions/76127108/…
Привет, @Aks, я столкнулся с одной проблемой, когда pub получает код выхода с ошибкой: 65 после обновления флаттера, я разместил вопрос, пожалуйста, проверьте, а ссылка на помощь - stackoverflow.com/questions/76163053/…
Попробуйте это
_cardnameController..text=cardName
. В противном случае вам нужно вызвать API вinitState
и передать значение контроллеру.