首页 > 解决方案 > Flutter,NoSuchMethod:在 null 上调用了 getter 'notes'

问题描述

我正在学习颤振并尝试使用继承的小部件和地图列表制作笔记应用程序和硬编码 3 个笔记。问题是,到目前为止,当我尝试运行该应用程序时,我得到了这个错误: I/flutter (32083): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (32083): The following NoSuchMethodError was thrown building HomeScreen(dirty, state: I/flutter (32083): _HomeScreenState#050b1): I/flutter (32083): The getter 'notes' was called on null. I/flutter (32083): Receiver: null I/flutter (32083): Tried calling: notes I/flutter (32083):

这是到目前为止的代码:

主要飞镖:

import 'package:flutter/material.dart';

import 'home_screen.dart';
import 'note_inherited_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NoteInheritedWidget(
          MaterialApp(
        home: HomeScreen(),
        theme: ThemeData(
            primaryColor: Colors.deepOrange, accentColor: Colors.deepPurple),
      ),
    );
  }
}

home_screen.dart

import 'package:flutter/material.dart';
import 'package:simple_notes/note_inherited_widget.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final myController = TextEditingController();

  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    myController.dispose();
    super.dispose();
  }

  List<Map<String, String>> get notes => NoteInheritedWidget.of(context).notes;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Simple Notes'),
          centerTitle: true,
        ),
        body: ListView.builder(itemBuilder: (context, index) {
          return Card(
            child: Column(
              children: <Widget>[
                NoteTitle(notes[index]['title']), 
                NoteText(notes[index]['text'])],
            ),
          );
        },
        itemCount: notes.length,
        ),
        bottomNavigationBar: (FlatButton(
            onPressed: () {
              showMyDialog(context);
            },
            child: Text('Add note'))));
  }

  Future<void> showMyDialog(
    BuildContext context,
  ) {
    return showDialog<void>(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: TextField(),
            actions: <Widget>[
              new FlatButton(
                  onPressed: () => Navigator.pop(context), child: Text('Save'))
            ],
          );
        });
  }
}

class NoteTitle extends StatelessWidget {
  final String title;

  NoteTitle(this.title);

  @override
  Widget build(BuildContext context) {
    return Text(
      title,
      style: TextStyle(
        fontSize: 25,
        fontWeight: FontWeight.bold
      ),
    );
  }
}

class NoteText extends StatelessWidget {
  final String text;

  NoteText(this.text);

  @override
  Widget build(BuildContext context) {
    return Text(
      text,
      style: TextStyle(
        color: Colors.grey.shade600,
      ),
      maxLines: 2,
      overflow: TextOverflow.ellipsis,
    );
  }
}

note_inherited_widget.dart

import 'package:flutter/material.dart';

class NoteInheritedWidget extends InheritedWidget {

  final notes = [
    {
      'title': 'My first title',
      'text': 'My first text'
    },
    {
      'title': 'My second title',
      'text': 'My second  text'
    },
    {
      'title': 'My third title',
      'text': 'My third text'
    }
  ];

  NoteInheritedWidget(Widget child) : super(child: child);

bool updateShouldNotify(NoteInheritedWidget oldwidget) => oldwidget.notes != notes;

  static NoteInheritedWidget of(BuildContext context) =>
    context.dependOnInheritedWidgetOfExactType(aspect: NoteInheritedWidget) as NoteInheritedWidget;
}

我在尝试实现继承的小部件方法时也遇到了问题,我认为那里可能存在我不理解的错误。因此,如果你们中的任何人可以帮助我解决这个问题,那就太好了。@{11488366}

先感谢您!

标签: flutterdartnosuchmethod

解决方案


你能试试这个吗?

List<Map<String, String>> notes;

@override
Widget build(BuildContext context) {
  notes = NoteInheritedWidget.of(context).notes;

代替;

List<Map<String, String>> get notes => NoteInheritedWidget.of(context).notes;

推荐阅读