错误“formDataList”未定义。在颤振应用程序中

问题描述 投票:0回答:1

我正在开发一个 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(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

我是颤振新手,所以任何帮助都会很棒!!!

提前致谢!

flutter dart web-applications
1个回答
0
投票

您遇到的错误似乎是由于 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 相关的错误,我在其中看到。

© www.soinside.com 2019 - 2024. All rights reserved.