我正在开发一个 flutter 库存剩余应用程序,该应用程序接受在表单上输入的输入,将它们存储在本地存储中,然后重定向到摘要页面,在其中将本地存储数据加载到 DataColumns 中
我的表单页面上有一个错误,如下:
[{
"resource": "/c:/Users/cdebrodie/Documents/apps/surplus/surplus/lib/main.dart",
"owner": "_generated_diagnostic_collection_name_#0",
"code": {
"value": "undefined_named_parameter",
"target": {
"$mid": 1,
"external": "https://dart.dev/diagnostics/undefined_named_parameter",
"path": "/diagnostics/undefined_named_parameter",
"scheme": "https",
"authority": "dart.dev"
}
},
"severity": 8,
"message": "The named parameter 'formDataList' isn't defined.\nTry correcting the name to an existing named parameter's name, or defining a named parameter with the name 'formDataList'.",
"source": "dart",
"startLineNumber": 43,
"startColumn": 81,
"endLineNumber": 43,
"endColumn": 93
}]
这是main.dart代码
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:surplus/summary';
void main() => runApp(MaterialApp(home: MyApp(),));
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<MyCustomForm> forms = [];
String? _selectedSchool;
final List<String> _schools = [
'Gentry Middle School',
'Oakland Middle School',
'Jefferson Middle School',
'West Middle School',
];
List<String> formDataList = []; // Declare formDataList here
@override
void initState() {
super.initState();
forms.add(MyCustomForm(formDataList: formDataList, onCpsNumberTyped: addNewForm));
}
void addNewForm() {
setState(() {
forms.add(MyCustomForm(formDataList: formDataList, onCpsNumberTyped: addNewForm));
});
}
void reviewData(BuildContext context) async {
final prefs = await SharedPreferences.getInstance();
formDataList.clear(); // Clear formDataList before adding new data
forms.forEach((form) {
formDataList.add('${_selectedSchool ?? 'No School Selected'}|${form.cpsNumber}|${form.itemDescription}|${form.selectedReason}');
});
await prefs.setStringList('formData', formDataList);
Navigator.push(context, MaterialPageRoute(builder: (context) => SummaryPage(formDataList: formDataList)));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Navigator(
onGenerateRoute: (settings) {
return MaterialPageRoute(builder: (context) => Scaffold(
appBar: AppBar(
title: Text('Dynamic Form Addition'),
),
body: Column(
children: [
Padding(
padding: EdgeInsets.all(16.0),
child: DropdownButtonFormField<String>(
value: _selectedSchool,
decoration: InputDecoration(
labelText: 'Select School',
border: OutlineInputBorder(),
),
onChanged: (String? newValue) {
setState(() {
_selectedSchool = newValue;
});
},
items: _schools.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
),
Expanded(
child: ListView.builder(
itemCount: forms.length,
itemBuilder: (context, index) => forms[index],
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: ElevatedButton(
onPressed: () => reviewData(context),
child: Text('REVIEW'),
),
),
],
),
));
},
),
);
}
}
class MyCustomForm extends StatefulWidget {
final VoidCallback onCpsNumberTyped;
final List<String> formDataList; // Add formDataList as a named parameter
MyCustomForm({required this.onCpsNumberTyped, required this.formDataList}); // Modify the constructor
@override
_MyCustomFormState createState() => _MyCustomFormState(formDataList: formDataList); // Pass formDataList to state
String get cpsNumber => '';
String get itemDescription => '';
String get selectedReason => '';
}
class _MyCustomFormState extends State<MyCustomForm> {
final TextEditingController _cpsNumberController = TextEditingController();
final TextEditingController _itemDescriptionController = TextEditingController();
List<String> formDataList; // Remove declaration here
_MyCustomFormState({required this.formDataList}); // Add constructor to receive formDataList
String? selectedReason;
bool isFirstTime = true;
final List<String> _reasonsForSurplus = [
'Obsolete Equipment',
'Replacement',
'Damage',
'Others',
];
String get cpsNumber => _cpsNumberController.text;
String get itemDescription => _itemDescriptionController.text;
@override
void initState() {
super.initState();
_cpsNumberController.addListener(() {
if (isFirstTime && _cpsNumberController.text.isNotEmpty) {
widget.onCpsNumberTyped();
isFirstTime = false;
}
});
}
@override
void dispose() {
_cpsNumberController.dispose();
_itemDescriptionController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
controller: _cpsNumberController,
decoration: InputDecoration(
labelText: 'CPS Number',
border: OutlineInputBorder(),
),
onChanged: (newValue) {
// Add the form data to the list when CPS Number is changed
formDataList.add('${newValue ?? ''}|${_itemDescriptionController.text}|$selectedReason');
},
),
SizedBox(height: 24.0),
TextFormField(
controller: _itemDescriptionController,
decoration: InputDecoration(
labelText: 'Item Description',
border: OutlineInputBorder(),
),
maxLines: null,
),
SizedBox(height: 24.0),
DropdownButtonFormField<String>(
value: selectedReason,
decoration: InputDecoration(
labelText: 'Reason for Surplus',
border: OutlineInputBorder(),
),
onChanged: (String? newValue) {
setState(() {
selectedReason = newValue;
});
},
items: _reasonsForSurplus.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
],
),
),
),
);
}
}
我是颤振新手,所以任何帮助都会很棒!!!
提前致谢!
您遇到的错误似乎是由于 MyCustomForm 类中缺少 formDataList 变量的声明所致。
在 MyCustomForm 类中,将 formDataList 的声明添加为构造函数中的命名参数。 本质上,您必须修改构造函数以接受 formDataList。 您应该将 formDataList 传递给状态类 _MyCustomFormState。 尝试更新 MyCustomForm 类的代码:
class MyCustomForm extends StatefulWidget {
final VoidCallback onCpsNumberTyped;
final List<String> formDataList; // Add formDataList as a named parameter
MyCustomForm({required this.onCpsNumberTyped, required this.formDataList}); // Modify the constructor
@override
_MyCustomFormState createState() => _MyCustomFormState(formDataList: formDataList); // Pass formDataList to state
String get cpsNumber => '';
String get itemDescription => '';
String get selectedReason => '';
}
同样在 _MyCustomFormState 类中,您必须删除 formDataList 的声明。您的代码应该解决与未定义的命名参数 formDataList 相关的错误,我在其中看到。