【问题标题】:NoSuchMethodError: getter length was called on nullNoSuchMethodError:在 null 上调用了 getter 长度
【发布时间】:2020-10-30 03:18:07
【问题描述】:

我能够创建 SQFLite 数据库并运行查询,但是,当我尝试使用 listview.separated 小部件显示结果时收到 noSuchMethodError。回顾了其他类似的堆栈溢出主题,但没有运气。代码错误——创建局部变量?

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

final dbHelper = DatabaseHelper();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<Breeds> allBreedsList;

    return MaterialApp(
        title: 'My 1st App',
        home: Scaffold(
            appBar: AppBar(
              title: Text('Pets, Pets, Pets'),
            ),
        body: Center(
            child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
              RaisedButton(
                  child: Text(
                    'query',
                    style: TextStyle(fontSize: 20),
                  ),
                  onPressed: () {
                    print("Yeah, it works!");
                    {
                      _pullAllbreed();
                    }
                    Expanded(
                        child: ListView.separated(
                      itemBuilder: (context, index) {
                        return ListTile(
                          leading: Text("${allBreedsList[index]}"),
                          title: Text("${allBreedsList[index].name}"),
                        );
                      },
                      separatorBuilder: (context, index) => Divider(),
                      itemCount: allBreedsList.length,
                    ));
                  }),
            ]))));
  }
}

void _pullAllbreed() async {
  final allBreedsList = await dbHelper.breedList();
  print('querying all breeds now, please stand by');
  allBreedsList.forEach((row) => print(row));
  int breedCount = allBreedsList.length;
  print(breedCount);
}

【问题讨论】:

    标签: flutter dart sqflite


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    第 1 步:从 RaisedButton 移出 ListView.separated
    第 2 步:从 build 移出 List&lt;Breeds&gt; allBreedsList
    第3步:MyApp使用StatefulWidget并在_pullAllbreed();之后调用setState(() {});

    onPressed: () {
            print("Yeah, it works!");
            _pullAllbreed();
            setState(() {});
          }),
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    
    class DatabaseHelper {
      Future<List<Breeds>> breedList() {
        return Future.value(
            [Breeds(name: "a"), Breeds(name: "b"), Breeds(name: "c")]);
      }
    }
    
    class Breeds {
      String name;
      Breeds({this.name});
    }
    
    void main() => runApp(MyApp());
    
    final dbHelper = DatabaseHelper();
    
    List<Breeds> allBreedsList = [];
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'My 1st App',
            home: Scaffold(
                appBar: AppBar(
                  title: Text('Pets, Pets, Pets'),
                ),
                body: Center(
                    child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                      RaisedButton(
                          child: Text(
                            'query',
                            style: TextStyle(fontSize: 20),
                          ),
                          onPressed: () {
                            print("Yeah, it works!");
                            _pullAllbreed();
                            setState(() {});
                          }),
                      Expanded(
                          child: ListView.separated(
                        itemBuilder: (context, index) {
                          return ListTile(
                            leading: Text("${allBreedsList[index]}"),
                            title: Text("${allBreedsList[index].name}"),
                          );
                        },
                        separatorBuilder: (context, index) => Divider(),
                        itemCount: allBreedsList.length,
                      ))
                    ]))));
      }
    }
    
    void _pullAllbreed() async {
      allBreedsList = await dbHelper.breedList();
      print('querying all breeds now, please stand by');
      allBreedsList.forEach((row) => print(row));
      int breedCount = allBreedsList.length;
      print(breedCount);
    }
    

    【讨论】:

    • 啊,'setState',我明白了。现在测试。谢谢。
    • 成功复制结果;问题解决了。谢谢!
    猜你喜欢
    • 2021-07-18
    • 2018-12-03
    • 2020-06-15
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2020-08-11
    • 2020-05-05
    相关资源
    最近更新 更多