Flutter:NoSuchMethodError:方法 'fetchByID' 在 null 上被调用。接收方:null 尝试调用:fetchByID(2)

Posted

技术标签:

【中文标题】Flutter:NoSuchMethodError:方法 \'fetchByID\' 在 null 上被调用。接收方:null 尝试调用:fetchByID(2)【英文标题】:Flutter: NoSuchMethodError :The method 'fetchByID' was called on null. Receiver: null Tried calling: fetchByID(2)Flutter:NoSuchMethodError:方法 'fetchByID' 在 null 上被调用。接收方:null 尝试调用:fetchByID(2) 【发布时间】:2020-08-21 09:42:13 【问题描述】:

我是 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】:

您没有在 _DetailNotizState 中调用 NotizListeState,这就是您收到错误消息的原因。

由于您没有使用 NotizListeState,因此您无法将密钥传递给 NotizListe,因为您会收到此错误。

此外,在没有调用 build 方法之前,您不能使用 key,因为它没有将 key 分配给该小部件。

完整代码演示:

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();
  

【讨论】:

感谢您的快速回答 :D,但我该如何打电话给班级?可以举个例子吗? 您是否像使用 FullNotiz 类一样使用 NotizListe 类? 什么意思? FullNotiz 仅适用于 2 个文本小部件。 如果您在屏幕中使用该小部件,您只能使用状态方法。我展示了完整的演示如何使用以及如何使用。 感谢您的帮助。我修好了它,它奏效了。我在我的 notizList.dart 中创建了一个新的小部件,我只在 notiz_Detail.dart 中调用了它。再次感谢您:D

以上是关于Flutter:NoSuchMethodError:方法 'fetchByID' 在 null 上被调用。接收方:null 尝试调用:fetchByID(2)的主要内容,如果未能解决你的问题,请参考以下文章

未处理的异常:NoSuchMethodError:方法'showNotificationDaily'在flutter中被调用为null

Flutter:[cloud_firestore/unknown] NoSuchMethodError:null 上的无效成员:'includeMetadataChanges'(Flutter Web

Flutter - NoSuchMethodError:方法'visitChildren'在null上被调用

Flutter:抛出了 NoSuchMethodError。在 null 上调用了 getter 'type'

Flutter:NoSuchMethodError:方法 'fetchByID' 在 null 上被调用。接收方:null 尝试调用:fetchByID(2)

Flutter Firestorage getDownloadUrl() 返回 NoSuchMethodError