簡體   English   中英

CallBacks 錯誤:在 null 上調用了方法“call”

[英]CallBacks error : The method 'call' was called on null

我目前正在研究教程,其中將變量傳輸到外部文件到另一個(帶回調)

但我有這個錯誤:

======== Exception caught by gesture ===============================================================
The following NoSuchMethodError was thrown while handling a gesture:
The method 'call' was called on null.
Receiver: null
Tried calling: call(3)

When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      Son.build.<anonymous closure> (package:montest/son.dart:24:21)
#2      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#3      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:607:11)
#4      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#cf4d9
  debugOwner: GestureDetector
  state: possible
  won arena
  finalPosition: Offset(178.3, 84.9)
  button: 1
  sent tap down
====================================================================================================

飛鏢

///
/// Inside the Child Widget
///
import 'package:flutter/material.dart';

// Step 1: Define a Callback.
typedef void IntCallback(int id);

class Son extends StatelessWidget {
  // Step 2: Configre the child to expect a callback in the constructor(next 2 lines):
  final IntCallback onSonChanged;
  Son({ @required this.onSonChanged });

  int elementId = 3;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // Step 3: On specific action(e.g onPressed/
        // onTap/onLoad.. onWhatEver) trigger the callback
        // with the data you want to pass to the parent.
        // Data will be passed as parameter(see elementId):
        onSonChanged(elementId);
        // Done in the child.
      },
      child: Text('Click me to call the callback!'),
    );
  }
}
///
///////////////

父.dart

import 'son.dart';

///
/// Inside the Parent Widget
///
import 'package:flutter/material.dart';

class Father extends StatefulWidget {
  @override
  _FatherState createState() => _FatherState();
}

class _FatherState extends State<Father> {
  // Step 1 (optional): Define a Global variable
  // to store the data comming back from the child.
  int id;

  // Step 2: Define a function with the same signature
  // as the callback, so the callback will point to it,
  // this new function will get the data from the child,
  // set it to the global variable (from step 1)
  // in the parent, and then update the UI by setState((){});
  void updateId(int newId) {
    setState(() {
      id = newId;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // Step 3: Construct a child widget and pass the
        child: Son(
          // Many options to make onSonChanged points to
          // an executable code(function) within memory
          // called 'updateId':
          //
          // 1st option:
          onSonChanged: (int newId) {
            updateId(newId);
          },
          // 2nd option: onSonChanged: updateId,
          // 3rd option: onSonChanged: (int newId) => updateId(newId)

          // So each time the 'onSonChanged' called by the action
          // we defined inside the child, a new data will be
          // passed to this parent.
        )
    );
  }
}

謝謝你的幫助

使id空並檢查它。

試試這個

import 'package:flutter/material.dart';

typedef void IntCallback(int id);

class Son extends StatelessWidget {
  final IntCallback onSonChanged;

  Son({required this.onSonChanged});

  int elementId = 3;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        onSonChanged(elementId);
      },
      child: Text('Click me to call the callback!'),
    );
  }
}

class Father extends StatefulWidget {
  @override
  _FatherState createState() => _FatherState();
}

class _FatherState extends State<Father> {
  int? id;

  void updateId(int newId) {
    setState(() {
      id = newId;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        id == null ? Text(" son value: null") : Text("son value: $id"),
        Container(
          child: Son(
            onSonChanged: (int newId) {
              updateId(newId);
            },
          ),
        ),
      ],
    );
  }
}


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM