【问题标题】:Flutter: DropdownButton SetState not functional颤振:DropdownButton SetState 不起作用
【发布时间】:2021-04-04 10:34:10
【问题描述】:

我有一个 DropDownButton,它是从一个 SQLite 数据库中填充的,这对于我的应用程序来说现在还可以。但是选择一个条目后,DropDownButton 没有显示选择的条目,只是提示。为了检查我的条目,我尝试用所选条目填充文本字段,但这也没有改变。这是我的 DropDownButton 代码:

  List<DropdownMenuItem<String>> teamList;
  DropdownMenuItem selectedTeam;

  DropdownButton(
          hint: Text("Choose"),
          value: selectedTeam,
          onChanged: (value) {
            setState(() {
              _teamController.text = value.name;
              selectedTeam = value;
            });
          },
          items: teamList,
        ),

实际上,我在 initstate 中用 coden-p 填充了我的 teamList:

super.initState();

teamList = [];
db.getData().then((listMap) {
  listMap.map((map) {
    print(map.toString());
    return getDropDownWidget(map);
  }).forEach((dropDownMenuItem) {
    teamList.add(dropDownMenuItem);
  });
  setState(() {});
});

还有这个:

DropdownMenuItem<String> getDropDownWidget(Map<String, dynamic> map) {
  return DropdownMenuItem<String>(
    value: map['team'],
    child: Text(map['team']),
);

}

在我的 dbhelper 文件中,我有以下代码:

Future<List<Map<String, dynamic>>> getData() async {
var dbClient = await db;
return await dbClient.rawQuery('SELECT team FROM teamTable');

}

【问题讨论】:

标签: flutter


【解决方案1】:

嘿,托马斯,看看这个例子:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SampleApp(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class SampleApp extends StatefulWidget {
  @override
  _SampleAppState createState() => _SampleAppState();
}

class _SampleAppState extends State<SampleApp> {
  List<String> teamList = ['Sample', 'Sample2', 'Sample3', 'Sample4'];
  String selectedTeam;
  TextEditingController _teamController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Your heading'),
        ),
        body: Container(
            child: Column(
          children: <Widget>[
            TextFormField(
              controller: _teamController,
            ),
            new DropdownButton<String>(
              items: teamList.map((String value) {
                return new DropdownMenuItem<String>(
                  value: value,
                  child: new Text(value),
                );
              }).toList(),
              value: selectedTeam,
              hint: Text('Choose'),
              
            
              onChanged: (value) {
                setState(() {
                  _teamController.text = value;
                  selectedTeam = value;
                  print('This is the selected value: $selectedTeam');
                });
              },
            ),
          ],
        )));
  }
}

让我知道它是否有效。

【讨论】:

  • 我尝试按照您的回答,但我在从 SQLite 填充 teamList 时遇到问题。我的代码看起来像:teamList = []; db.getData().then((listMap) { listMap.map((map) { print(map.toString()); return getDropDownWidget(map); }).forEach((dropDownItem) { teamList.add(dropDownItem) ; }); setState(() {}); });现在我没有“dropDownItem”,我无法弄清楚你的解决方案应该是什么
  • 请在您未在 cmets 中询问的问题中添加代码,仅从您发布的代码中添加代码,您可能需要等待并等待您从数据库中获取数据。
  • 在那之前,我只会更新我的答案并使用 sqlite 数据库来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2019-08-29
  • 2018-11-17
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多