Flutter, NoSuchMethod: «заметки» получателя вызваны на нуль - PullRequest
0 голосов
/ 18 апреля 2020

Я учусь трепетать и пытаюсь сделать приложение для заметок и жестко кодировать 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):

Это код на данный момент:

main.dart:

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;
}

У меня также были проблемы при попытке реализовать метод унаследованных виджетов, я думаю, что там могут быть ошибки, которые я не понимаю , Так что, если кто-нибудь из вас, ребята, мог бы помочь мне с этим, это было бы ужасно c. @ {11488366}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Полагаю, вам нужно разделить, создать фиктивный класс данных следующим образом:

class DummyDataProvider{

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'
    }
  ];
 } 

И создать экземпляр этого класса внутри вашего виджета, который расширяет InheritedWidget, чтобы вы могли предоставить тот же экземпляр, используя InheritedWidget.

class NoteInheritedWidget extends InheritedWidget {

  final dummyData = DummyDataProvider();

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


 @override
  bool updateShouldNotify(NoteInheritedWidget old) => dummyData != old.dummyData ;

  static DummyDataProvider of(BuildContext context) =>
    context.dependOnInheritedWidgetOfExactType<NoteInheritedWidget>().dummyData;
}

И не забудьте удалить эту строку кода:

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

И заменить ее на эту и вызвать метод of внутри метода didChangeDependinces, так как контекст готов к использованию в этом методе:

 DummyDataProvider notes;

     @override
     void didChangeDependencies()
     {
     super.didChangeDependencies();
     notes = NoteInheritedWidget.of(context);
     }

Или вы можете вызвать его в методе build.

Не стесняйтесь проверять документы зависимостьOnInheritedWidgetOfExactType от здесь

0 голосов
/ 18 апреля 2020

Можете ли вы попробовать это;

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;
...