首页 > 解决方案 > Flutter 我想重建列表但无法分配

问题描述

我想在 Flutter 中提取数据库并用动态复选框列出它,但是我收到一个错误。有人告诉我通过参考这些链接来重建列表。 https://github.com/tekartik/sqflite/issues/140

但是出现了两个错误。错误:参数类型 'Future<List<Map<dynamic, dynamic>>>' 不能分配给参数类型 'Iterable'。和错误:不能将 'List' 类型的值分配给 'Future' 类型的变量

class Classname extends StatefulWidget {
  Classname({Key key}) : super(key: key);

  @override
  createState() => _ClassnameState();
}

class _ClassnameState extends State<Classname> {
  String test;
  String test2;
  String test3;
  bool isChecked = false;
  Future _data;

  @override
  void initState() {
    _data = List.from(getData());
    super.initState();
  }

  Future<List<Map>> getData() async {
    String path = join(await getDatabasesPath(), 'dbname.db');

    Database database = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      await db.execute(
          "CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
    });

    List<Map> result = await database.rawQuery('SELECT * FROM tablename');
    return result;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<Map>>(
        future: _data,
        builder: (context, result) {
      if (result.connectionState == ConnectionState.waiting) {
            return Center(
                child:
                    CircularProgressIndicator());
          }
          if (!result.hasData) {
            return Center(
              child: Text(
                  'no data'),
            );
          }
          return SingleChildScrollView(
            child: Container(
              child: Column(
                children: List.generate(result.data.length, (index) {
                  var data = result.data[index];
                  test = data['test'];
                  test2 = data['test2'];
                  test3 = data['test3'];
                  data.putIfAbsent('isChecked', () => false);
                  return Column(
                    children: [
                      Row(
                        children: <Widget>[
                          Checkbox(
                            value: data['isChecked'],
                            onChanged: (bool value) {
                              setState(() {
                                data['isChecked'] = value;
                              });
                            },
                          ),
                          Container(
                            child: Text(
                              test,
                            ),
                          ),
                          Container(
                            child: Text(test2),
                          ),
                        ],
                      ),
                      Align(
                        alignment: Alignment.centerLeft,
                        child: Text(
                          test3,
                        ),
                      ),
                    ],
                  );
                }),
              ),
            ),
          );
        },
      ),
    );
  }
}

所以我也尝试更改变量的定义,Future<List<Map>> _data等等,但出现了错误。在上述情况下,错误:不能将“List”类型的值分配给“Future<List<Map<String, dynamic>>>”类型的变量。和错误:参数类型 'Future<List<Map<dynamic, dynamic>>>' 不能分配给参数类型 'Iterable'

请告诉如何解决。

标签: listflutterdartrebuild

解决方案


这一行出现了两个错误:

_data = List.from(getData());

参数类型“Future<List<Map<dynamic, dynamic>>>”不能分配给参数类型“Iterable”

命名工厂构造函数List.of(...)的第一个参数需要 a Iterable,但在您的情况下,getData()是 a Future,因此发生了错误。

“List”类型的值不能分配给“Future<List<Map<String, dynamic>>>”类型的变量

您的案例中的_data字段被声明为Future,但它被分配了List,因此发生了错误。

要解决它们,请不要使用List.of. getData()是一个未来,_data只是需要它。

  @override
  void initState() {
    super.initState();
    _data = getData();
  }

另一种方式是使用result列表。删除FutureBuilder并更改Future _dataList _data,并将其值分配getDataresult

  List _data;

  @override
  void initState() {
    super.initState();
    getData();
  }

  Future<void> getData() async {
    String path = join(await getDatabasesPath(), 'dbname.db');

    Database database = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      await db.execute(
          "CREATE TABLE tablename(id INTEGER PRIMARY KEY, test TEXT, test2 TEXT, test3 TEXT)");
    });

    List<Map> result = await database.rawQuery('SELECT * FROM tablename');
    setState((){
       _data = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _data == null 
        ? CircularProgressIndicator()
        : _data.isEmpty()
          ? Center(child: Text('no data'))
          : SingleChildScrollView(),
     );
  }

推荐阅读