getter 'length' 被调用为 null。接收者:空尝试调用:长度(感谢谁帮助我)

时间:2021-03-31 12:40:27

标签: flutter dart

我不是 flutter 的专家,我还在学习它,但我不明白我错在哪里。 我感谢任何想帮助我的人 我不是颤振方面的专家,我仍在学习它,但我不明白我错在哪里。 我感谢任何想帮助我的人 我不是颤振方面的专家,我仍在学习它,但我不明白我错在哪里。 感谢任何想帮助我的人

import 'package:flutter/material.dart';
    import 'package:todo_app/database_helper.dart';
    import 'package:todo_app/screens/taskpage.dart';
    import 'package:todo_app/widgets.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  DatabaseHelper _dbHelper = DatabaseHelper();

  @override
  Widget build(
    BuildContext context,
  ) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.deepPurple,
        child: Icon(Icons.add),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => TaskPage(),
            ),
          );
        },
      ),
      body: SafeArea(
        child: Container(
          width: double.infinity,
          padding: EdgeInsets.symmetric(horizontal: 24),
          margin: EdgeInsets.only(bottom: 20),
          color: Colors.grey[100],
          child: Stack(children: [
            Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
              Container(
                margin: EdgeInsets.only(bottom: 32),
                child: Text(
                  'Logo',
                  style: TextStyle(fontSize: 22),
                ),
              ),
              Expanded(
                child: FutureBuilder(
                  future: _dbHelper.getTasks(),
                  builder: (context, AsyncSnapshot snapshot) {
                    return ListView.builder(
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return TaskCardWidget(
                            title: snapshot.data[index].title,
                            desc: snapshot.data[index].description,
                          );
                        });
                  },
                ),
              ),
            ])
          ]),
        ),
      ),
    );
  }
}




// This is the database class instead

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:todo_app/models/task.dart';

class DatabaseHelper {
  Future<Database> database() async {
    return openDatabase(
      join(await getDatabasesPath(), 'todo_database.db'),
      onCreate: (db, version) {
        return db.execute(
          "CREATE TABLE task(id INTEGER PRIMARY KEY, title TEXT, description TEXT)",
        );
      },
      version: 1,
    );
  }

  Future<void> insertTask(Task task) async {
    Database _db = await database();
    await _db.insert('task', task.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

  Future<List<Task>> getTasks() async {
    final Database _db = await database();
    final List<Map<String, dynamic>> taskMap = await _db.query('tasks');
    return List.generate(
        taskMap.length,
        (index) => Task(
              id: taskMap[index]['id'],
              title: taskMap[index]['title'],
              description: taskMap[index]['description'],
            ));
  }
}

1 个答案:

答案 0 :(得分:0)

最初当您的 Future 未完成时,您没有来自 AsyncSnapshot 的数据。尝试在您的 FutureBuilder 中添加以下检查。

FutureBuilder(
  future: _dbHelper.getTasks(),
  builder: (context, AsyncSnapshot snapshot) {
    if (snapshot.hasError) {
      return Text('${snapshot.error}');
    } else if (snapshot.hasData) {
      return ListView.builder(...);
    }
    return Center(child: CircularProgressIndicator()); // Default loading
  },
)