Flutter: NoSuchMethodError: метод fetchByID был вызван с нулевым значением. Получатель: null Пробовал позвонить: fetchByID (2) - PullRequest
0 голосов
/ 06 мая 2020

Я новичок во Flutter, и это мой первый проект. Я пытаюсь перейти на новый сайт с параметрами. Параметр принят, но функция в моем классе notizList возвращает сообщение об ошибке.

Я знаю, что моя проблема находится в строке: Notiz notiz = key.currentState.fetchByID(widget.notizID);

Сообщение об ошибке:

The method 'fetchByID' was called on null.
Receiver: null
Tried calling: fetchByID(2)

Это соответствующие файлы.

app.dart

import 'style.dart';
import 'package:my_new_test_app/style.dart';
import 'Screens/home_screen.dart';
import 'Screens/notiz_detail.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: _routes(),
      title: 'Notice',
      theme: _theme(),
    );
  }
}

ThemeData _theme() {
  return ThemeData(
    primaryColor: Colors.white,
  appBarTheme: AppBarTheme(
    textTheme : TextTheme(headline6: AppBarTextStyle)),
  textTheme: TextTheme(
  bodyText2: Body1Style,
  headline6: Title1Sytle),
);
}

RouteFactory _routes(){
  return(settings){
    final Map<String, dynamic> args = settings.arguments;
    Widget screen;
    switch (settings.name){
      case '/':
        screen = Test();
        return MaterialPageRoute(builder: (BuildContext context) => screen);
        break;
      case '/detailNotiz':
        screen = DetailNotiz(notizID: args['id']);
        return MaterialPageRoute(builder: (BuildContext context) => screen);
        break;
      default:
        return null;
    }
  };
}

notiz_detail.dart (где проблема)

import 'package:my_new_test_app/models/notiz.dart';
import '../Widgets/detail_notiz_widget.dart';
import '../models/notizList.dart';


class DetailNotiz extends StatefulWidget {
const DetailNotiz({Key key, @required this.notizID}) : super(key: key);
final int notizID;

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


class _DetailNotizState extends State<DetailNotiz> {

  final GlobalKey<NotizListeState> key = GlobalKey<NotizListeState>();
  @override
  Widget build(BuildContext context) {
    Notiz notiz = key.currentState.fetchByID(widget.notizID);
    return Scaffold(
      appBar: 
        AppBar(
          centerTitle: true,
          title: Text(notiz.user+' am '+notiz.date)
          ),
        body:Container(
      child: FullNotiz(notiz.title, notiz.body),
    ),
    );
  }
}

notizList.dart

import 'package:flutter/material.dart';
import 'notiz.dart';
import '../Widgets/little_notiz_widget.dart';


class NotizListe extends StatefulWidget {

  NotizListe({Key key}) : super(key: key);
  @override
  NotizListeState createState() => NotizListeState();
}


class NotizListeState extends State<NotizListe> {

static List<Notiz> notizList =[
      Notiz(
      1,
      'USer', 
      "Title",
      "BOdy",
      "01.05.2020"
      ),
      Notiz(
       2,
       'USer', 
      "Title",
      "BOdy",
       "03.05.2020"
      ),
      Notiz(
       3,
       'USer', 
      "Title",
      "BOdy",
       "03.05.2020"
      ),
      Notiz(
       4,
       'USer', 
      "Title",
      "BOdy",
       "04.05.2020"
      ),
      Notiz(
       5,
       'USer', 
      "Title",
      "BOdy",
       "04.05.2020"
      ),

    ];


  void addToList(String title, String body){
    int index = notizList.length +1;
    Notiz element = Notiz(index, 'Marc', title, body, '05.05.2020');
    notizList.add(element);
  }

  Notiz fetchByID(int notizID){
    print('Die Länge der notiz Liste: '+ notizList.length.toString());
    print(notizID);
    for (var i = 0; i<notizList.length;i++){
      if(notizList[i].id == notizID){
        return notizList[i];
      }
    }
    return notizList[1];
  }

  @override
  Widget build(BuildContext context) {
    return notizenListView(context, notizList);
  }

  Widget notizenListView(BuildContext context, List<Notiz> notizList){
    return ListView.builder(
      itemCount: notizList.length,
      itemBuilder: (context, index) => 
          _itemBuilder(context, notizList[index]),
      );
  }
}



_onNotizTap(BuildContext context, int notizenId){
  Navigator.pushNamed(context,  '/detailNotiz', arguments: {"id": notizenId});
}

  Widget _itemBuilder(BuildContext context, Notiz notizen){

    return GestureDetector(
      onTap: ()=>_onNotizTap(context, notizen.id),
      key: Key('notizen_list_item_${notizen.id}'),
      child: Container(
        child: LittleNotiz(notizen.title, notizen.body),
      )
    );
  }


Спасибо за вашу помощь.

1 Ответ

1 голос
/ 06 мая 2020

Вы не вызываете NotizListeState в _DetailNotizState, поэтому вы получаете сообщение об ошибке.

Поскольку вы не используете NotizListeState, вы не можете передать ключ в NotizListe из-за этого вы получаете эту ошибку.

Более того, пока метод сборки не вызывает, вы не можете использовать ключ, потому что он не назначает ключ этому виджету.

полный код Демо:

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  hi() {
    key.currentState.callme();
  }

  final GlobalKey<Home1State> key = GlobalKey<Home1State>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        child: Column(
          children: [
            RaisedButton(
              onPressed: hi,
              child: Text("hello"),
            ),
            Home1(
              key: key,
            ),
          ],
        ),
      ),
    );
  }
}

class Home1 extends StatefulWidget {
  Home1({Key key}) : super(key: key);
  @override
  Home1State createState() => Home1State();
}

class Home1State extends State<Home1> {
  callme() {
    print("object");
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
...