NoSuchMethodError - 颤振[重复]

Posted

技术标签:

【中文标题】NoSuchMethodError - 颤振[重复]【英文标题】:NoSuchMethodError - Flutter [duplicate] 【发布时间】:2021-09-08 10:57:34 【问题描述】:

当我为一个页面运行我的应用程序时,我看到了错误:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY
╞═══════════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building Builder:
The method '-' was called on null.
Receiver: null
Tried calling: -(null)

The relevant error-causing widget was:
  MaterialApp
  file:///Users/daiquery/folder/Workspace/runsmith/runsmith/lib/main.dart:28:14

When the exception was thrown, this was the stack:
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      _MapState.calculateDistance (package:runsmith/pages/map.dart:51:17)
#2      _MapState.initState (package:runsmith/pages/map.dart:34:33)
#3      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4711:57)
#4      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4548:5)
...     Normal element mounting (24 frames)
#28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)
#29     MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6221:36)
#30     MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6232:32)
...     Normal element mounting (170 frames)
#200    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)
#201    MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6221:36)
#202    Element.updateChild (package:flutter/src/widgets/framework.dart:3363:18)
#203    RenderObjectElement.updateChildren
(package:flutter/src/widgets/framework.dart:5654:32)
#204    MultiChildRenderObjectElement.update
(package:flutter/src/widgets/framework.dart:6243:17)
#205    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#206    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#207    StatefulElement.performRebuild
(package:flutter/src/widgets/framework.dart:4746:11)
#208    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#209    StatefulElement.update (package:flutter/src/widgets/framework.dart:4778:5)
#210    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#211    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#212    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#213    ProxyElement.update (package:flutter/src/widgets/framework.dart:4922:5)
#214    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#215    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#216    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#217    ProxyElement.update (package:flutter/src/widgets/framework.dart:4922:5)
#218    _InheritedNotifierElement.update
(package:flutter/src/widgets/inherited_notifier.dart:181:11)
#219    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#220    SingleChildRenderObjectElement.update
(package:flutter/src/widgets/framework.dart:6090:14)
#221    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#222    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#223    StatefulElement.performRebuild
(package:flutter/src/widgets/framework.dart:4746:11)
#224    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#225    StatefulElement.update (package:flutter/src/widgets/framework.dart:4778:5)
#226    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#227    SingleChildRenderObjectElement.update
(package:flutter/src/widgets/framework.dart:6090:14)
#228    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#229    SingleChildRenderObjectElement.update
(package:flutter/src/widgets/framework.dart:6090:14)
#230    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#231    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#232    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#233    ProxyElement.update (package:flutter/src/widgets/framework.dart:4922:5)
#234    Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
#235    ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:4599:16)
#236    StatefulElement.performRebuild
(package:flutter/src/widgets/framework.dart:4746:11)
#237    Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
#238    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2582:33)
#239    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:875:21)
#240    RendererBinding._handlePersistentFrameCallback
(package:flutter/src/rendering/binding.dart:328:5)
#241    SchedulerBinding._invokeFrameCallback
(package:flutter/src/scheduler/binding.dart:1144:15)
#242    SchedulerBinding.handleDrawFrame
(package:flutter/src/scheduler/binding.dart:1082:9)
#243    SchedulerBinding._handleDrawFrame
(package:flutter/src/scheduler/binding.dart:998:5)
#247    _invoke (dart:ui/hooks.dart:163:10)
#248    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:259:5)
#249    _drawFrame (dart:ui/hooks.dart:126:31)
(elided 3 frames from dart:async)

我已经尝试导航到其他页面,并且成功了。 这是我的代码:

import 'dart:async';
import 'dart:math';
import 'dart:developer' as developer;
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:runsmith/domain/run.dart';
import 'package:runsmith/pages/runend.dart';
import 'package:runsmith/domain/screensize_reducers.dart';
import 'package:runsmith/domain/formattime.dart';
import 'package:geolocator/geolocator.dart';

class MapPage extends StatefulWidget 
  @override
  _MapState createState() => _MapState();


class _MapState extends State<MapPage> 
  Stopwatch _elapsedTime;
  String now;
  Run currentRun;
  double distanceTravelled = 0.00;
  double distanceBetweenLastPoints;
  double latitudeData;
  double longitudeData;
  var month = DateTime.now().month;
  var day = DateTime.now().day;
  var lastLatitude;
  var lastLongitude;
// literally random comment to test
  @override
  void initState() 
    lastLatitude = latitudeData;
    lastLongitude = longitudeData;
    distanceBetweenLastPoints = calculateDistance(
        latitudeData, longitudeData, lastLatitude, lastLongitude);

    print(distanceBetweenLastPoints);
    distanceBetweenLastPoints = Geolocator.distanceBetween(
        latitudeData, longitudeData, lastLatitude, lastLongitude);

    super.initState();

    _elapsedTime = Stopwatch();
    _elapsedTime.start();
  

  double calculateDistance(lat1, lon1, lat2, lon2) 
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 -
        c((lat2 - lat1) * p) / 2 +
        c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
  

  getCurrentLocation() async 
    final geoposition = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.best);

    setState(() 
      latitudeData = geoposition.latitude;
      longitudeData = geoposition.longitude;
    );
  

  // points every 600ms and finding the distance between them, then
  // adding this to the distanceTravelled variable as an integer
  // two variables, last location and current location

  @override
  void dispose() 
    // _timer.cancel();
    super.dispose();
  

  void handleStartStop() 
    if (_elapsedTime.isRunning) 
      _elapsedTime.stop();
     else 
      _elapsedTime.start();
    

    setState(() );
  

  GoogleMapController mapController;
  final LatLng _center = const LatLng(45.521563, -122.677433);

  void _onMapCreated(GoogleMapController controller) 
    mapController = controller;
    Geolocator.getPositionStream(desiredAccuracy: LocationAccuracy.best)
        .listen((l) 
      mapController.animateCamera(
        CameraUpdate.newCameraPosition(
          CameraPosition(target: LatLng(l.latitude, l.longitude), zoom: 15),
        ),
      );
    );
  

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
          body: Column(
        children: [
          Container(
            height: screenHeight(context, dividedBy: 3),
            child: GoogleMap(
              onMapCreated: _onMapCreated,
              initialCameraPosition: CameraPosition(
                target: _center,
                zoom: 11.0,
              ),
            ),
          ),
          Container(
            color: Colors.blue,
            height: screenHeight(context),
            child: Column(
              children: [
                Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                  Padding(
                      padding: EdgeInsets.all(10),
                      child: Text('text',
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              height: 2.0,
                              fontSize: 50))),
                  Padding(
                      padding: EdgeInsets.all(10),
                      child: Text(formatTime(_elapsedTime.elapsedMilliseconds),
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              height: 2.0,
                              fontSize: 50)))
                ]),
                Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                  RaisedButton(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(50)),
                    onPressed: handleStartStop,
                    child: Icon(!_elapsedTime.isRunning
                        ? Icons.play_arrow
                        : Icons.pause),
                  ),
                  RaisedButton(
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(50)),
                    onPressed: () 
                      if (_elapsedTime.isRunning == false) 
                        // currentRun.runId = 00001;
                        // currentRun.time =
                        //     _elapsedTime.elapsedMilliseconds.toString();
                        // currentRun.date = now;
                        // currentRun.miles = 5.00;

                        // print(currentRun);
                        Navigator.push(
                          context,
                          MaterialPageRoute(builder: (context) => RunEndPage()),
                        );
                       else 
                        return;
                      
                    ,
                    child: Icon(Icons.stop),
                  )
                ])
              ],
            ),
          ),
        ],
      )),
    );
  

我一直收到此错误,尽管我尝试删除某些部分,添加调试器以查看问题所在,查看以前的 Navigator,但我还没有找到解决方案。

【问题讨论】:

请使用当前版本的 Flutter。您的问题是可以避免的,或者至少您会在当前版本中遇到编译器错误。 【参考方案1】:

calculateDistance 方法中,您正在执行以下计算

var a = 0.5 -
c((lat2 - lat1) * p) / 2 +
c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;

但是lat/lon 的值在这里是null,因为这是从initState 调用的

您可以在声明解决此问题时使用 0 值初始化 latitudeData/longitudeData

double latitudeData = 0;
double longitudeData = 0;

【讨论】:

以上是关于NoSuchMethodError - 颤振[重复]的主要内容,如果未能解决你的问题,请参考以下文章

小吃店不工作颤振NoSuchMethodError

怎么解决?颤振(6629):[错误:颤振/lib/ui/ui_dart_state.cc(209)]未处理的异常:NoSuchMethodError

“未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'iterator'。”当我在颤振中使用 google_maps_polyline 插件时抛出

NoSuchMethodError:在 null 上调用了方法 'ref'

NoSuchMethodError:nul 上的无效成员:“_set”

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