用现有数据填写表单在颤振中不工作

  • 本文关键字:工作 表单 数据 flutter
  • 更新时间 :
  • 英文 :


我最近开始扑动。我想用现有的数据填写表单,但两个下拉框不是由现有的数据填写。我挣扎了几个小时来解决这个问题,但没有运气。下面是我的完整代码:

import 'package:awesome_select/awesome_select.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/data/service.dart';
import '../common/bottom_navigation.dart';
import '../common/floating_button.dart';
import '../widget/TextInput.dart';
class NewPickupPoint extends StatefulWidget {
static const String routeName = '/newPickupPointPage';
const NewPickupPoint({Key? key}) : super(key: key);
@override
State<NewPickupPoint> createState() => _NewPickupPointState();
}
class _NewPickupPointState extends State<NewPickupPoint> {
final _formKey = GlobalKey<FormState>();
TextEditingController nameController = TextEditingController();
TextEditingController addressController = TextEditingController();
bool showform = false;
List<S2Choice<int>> districts = [];
List<S2Choice<int>> areas = [];
List userPickupPoint = [];
bool loadingDistrict = false;
bool loadingUpazilla = false;
bool loadingExistingData = false;
int districtId = 0;
int areaId = 0;
void initState() {
super.initState();
Service().getPickupAddress(context).then((response) {
setState(() {
nameController.text = response['title'];
addressController.text = response['street'];
districtId = response['district'];
areaId = response['upazilla'];
loadingExistingData = true;
});
});
updateDistrictList();
updateAreaList(districtId);
}
updateDistrictList() async {
var _futureOfList = Service().getDistrictList();
List list = await _futureOfList;
for (var i = 0; i < list.length; i++) {
setState(() {
districts
.add(S2Choice<int>(value: list[i]['id'], title: list[i]['name']));
loadingDistrict = true;
});
}
}
updateAreaList(int? value) async {
var _futureOfList = await Service().getAreaList(districtId, context);
List list = await _futureOfList;
List<S2Choice<int>> areaList = [];
setState(() {
list.forEach((element) {
areaList
.add(S2Choice<int>(value: element['id'], title: element['name']));
});
print(areaList);
});
setState(() {
areas = areaList;
});
}
setDistrictList() async {
var _futureOfList = Service().getDistrictList();
List list = await _futureOfList;
for (var i = 0; i < list.length; i++) {
setState(() {
districts
.add(S2Choice<int>(value: list[i]['id'], title: list[i]['name']));
});
}
}
@override
Widget build(BuildContext context) {
bool keyboardIsOpen = MediaQuery.of(context).viewInsets.bottom != 0;
return Scaffold(
appBar: AppBar(
title: Text('Add new pickup point'),
),
body: SingleChildScrollView(
child: new Form(
key: _formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
// Card For Showing user pickup addresse
Padding(
padding: MediaQuery.of(context).viewInsets,
child: SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10, horizontal: 30.0),
child: TextInput(
inputController: nameController,
label: 'Name of the pickup point',
icon: Icons.edit,
),
),
if (loadingDistrict && loadingExistingData)
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10, horizontal: 30.0),
child: SmartSelect<int>.single(
modalFilter: true,
modalFilterAuto: true,
tileBuilder: (context, state) => S2Tile<dynamic>(
//https://github.com/akbarpulatov/flutter_awesome_select/blob/master/example/lib/features_single/single_chips.dart
title: const Text(
'District',
),
value: state.selected?.toWidget() ?? Container(),
leading: Icon(Icons.list_outlined),
onTap: state.showModal,
),
title: 'District',
placeholder: 'Select',
choiceItems: districts,
onChange: (state) {
setState(() {
districtId = state.value!;
updateAreaList(state.value).then((value) {
setState(() {});
});
});
},
selectedValue: districtId,
),
),
if (loadingExistingData)
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10, horizontal: 30.0),
child: SmartSelect<int>.single(
modalFilter: true,
modalFilterAuto: true,
tileBuilder: (context, state) => S2Tile<dynamic>(
//https://github.com/akbarpulatov/flutter_awesome_select/blob/master/example/lib/features_single/single_chips.dart
title: const Text(
'এলাকা',
),
value: state.selected?.toWidget() ?? Container(),
leading: Icon(Icons.list_outlined),
onTap: state.showModal,
),
title: 'Area',
placeholder: 'Select',
choiceItems: areas,
onChange: (state) =>
setState(() => areaId = state.value!),
selectedValue: areaId,
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 10, horizontal: 30.0),
child: TextInput(
inputController: addressController,
label: 'Detail Address',
icon: Icons.map_outlined),
),
Text(
'For example: House 118/D, Road: 05, Mohanagar Project, Dhaka',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.grey,
fontSize: 10,
),
),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
_savePickupPoint(context);
}
},
child: Text('Save'),
)
],
),
),
),
]),
),
),
bottomNavigationBar: BottomNavigation(),
floatingActionButton: Visibility(
visible: !keyboardIsOpen,
child: Padding(
padding: EdgeInsets.only(
top: 45,
),
child: floating(context),
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
);
}
void _savePickupPoint(BuildContext context) {
Service().addPickupPoint(nameController.text, districtId, areaId,
addressController.text, context);
}
}

您有两个选择。

  1. 通过设置一个表单控件的初始值
TextFormField(
initialValue: 'The value you want to show',
)
  1. 通过获取值后立即设置控制器值。它可以在Init方法中,也可以在builder方法
  2. 之前。
_yourController.text = "The value you want to show";

最新更新