【问题标题】:Flutter DropdownButtonFormField is not workingFlutter DropdownButtonFormField 不起作用
【发布时间】:2020-02-06 09:13:59
【问题描述】:

我正在尝试通过从 API 获取值来填充下拉列表。 当我单击下拉菜单时,正在显示值,当我尝试选择一个值时,会引发以下错误

 items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.

列表中的值不为空

当我尝试删除下拉菜单的“值”属性时,错误未显示,但下拉菜单未显示所选值

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:something/Utils/formServices.dart';
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:intl/intl.dart';
import 'dart:convert';

String insurer;
String package;
List insCat = List();
List insurers = List();
List<DropdownMenuItem> items = [];

class AddOrEditPack extends StatefulWidget{
  @override
  AddOrEditPackState createState() =>AddOrEditPackState();
}

class AddOrEditPackState extends State<AddOrEditPack>{
  final formKey = GlobalKey<FormState>();
  String insuranceCategory = ' ';

  @override
  void initState() {
    getCategories();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: Text('Contact Us'),
          ),
          drawer: Drawer(
            child: ListView(
              children: <Widget>[
                ListTile(
                  title: Text("Home"),
                ),
              ],
            ),
          ),
          body:
          Form(
            key:formKey,
            child: ListView(
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.fromLTRB(10, 0, 0, 0),
                  child: DropdownButtonFormField<String>(
                    hint:Text('Insurance Category'),
                    items: insCat.map((item) {
                      return new DropdownMenuItem<String>(
                        child: new Text(item['name']),
                        // value: item['name'],
                      );
                    }).toList(),
                    onChanged: (String newValue) {
                      setState(() { insuranceCategory = newValue; });
                      print(newValue);
                    },
                 //  value: insuranceCategory,
                  ),
                ),
                Padding(
                  padding: EdgeInsets.fromLTRB(10, 10, 10,0),
                  child: RaisedButton(
                    onPressed: () {
                      contact();
                    },
                    child: Text('Submit'),
                  ),
                )
              ],
            ),
          )
      ),
    );
  }

  getCategories() async{
    var resp = await 
    http.get('http://192.168.4.101:3000/category/getCategoryList');
    print(resp.body);
    insCat = json.decode(resp.body);
    setState(() {
      insuranceCategory=insCat[0]['name'];
    });
  }
}

这是 API 返回的内容。

[
   {"_id":"5d8dad3a2fcb272b7c0e74b5","name":"life insurance"},
   {"_id":"5d8dad502fcb272b7c0e74b6","name":"vehicle insurance"},
   {"_id":"5d8dadb22fcb272b7c0e74b9","name":"life insurance"}
]

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    输出:

    void main() => runApp(MaterialApp(
          title: "Hospital Management",
          home: MyApp(),
        ));
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      String _mySelection = "2";
      final String url = "http://webmyls.com/php/getdata.php";
      List data = List(); //edited line
      List<DropdownMenuItem> items = [];
    
      Future<String> getSWData() async {
        var res = await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
        var resBody = json.decode(res.body);
    
        setState(() {
          data = resBody;
          items = data.map((item) => DropdownMenuItem(child: Text(item['item_name']), value: item['id'].toString())).toList();
          _mySelection = data[0]["id"];
        });
        print(resBody);
        return "Sucess";
      }
    
      @override
      void initState() {
        super.initState();
        this.getSWData();
      }
    
      @override
      Widget build(BuildContext context) {
        print("CoolTag: ${data.length}");
        return Scaffold(
          appBar: AppBar(title: Text("Hospital Management")),
          body: Center(
            child: DropdownButton(
              items: items,
              value: _mySelection,
              onChanged: (newVal) {
                setState(() {
                  _mySelection = newVal;
                });
              },
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 抛出 - 类型 'List>' 不是类型 'List>' 的子类型错误。我不应该初始化 _mySelection 的值。
    • 您是否在使用此代码?因为我运行了相同的代码,它工作得很好。
    • 这不是完全相同的代码。但是我应用了你给出的逻辑。它抛出了这个错误 'type 'List>' is not a subtype of type 'List>'..我用我正在使用的确切代码编辑了我的问题。对不起,如果我在其他代码上浪费了你的时间。
    • 使用List&lt;DropdownMenuItem&lt;String&gt;&gt; items = []; 并检查它是否有效。
    • type 'String' 不是 line child 的 'index' 类型 'int' 的子类型:new Text(item['name']),
    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多