【问题标题】:Flutter: What does the NoSuchMethodError: "The getter 'month' was called on null" mean? (DateTime package)Flutter:NoSuchMethodError:“getter 'month' was called on null”是什么意思? (日期时间包)
【发布时间】:2019-08-20 02:12:28
【问题描述】:

几天前我开始使用颤振,我在这里遇到了DateTime 包的一些问题。我正在尝试实现一种方法,该方法必须检查实际日期是星期一还是星期四等,然后它应该返回一个被添加到 _actualDatetimeUnformatted.add 函数的值。会不会是DateTime的add函数有问题,所以无法接收到方法的返回值days

这是完整的代码。问题出在static var _weekEndDatetimeUnformatted = _actualDatetimeUnformatted.add(new Duration(days: getWeekday(_actualDatetimeUnformatted))); 变量中。当我将值更改为 50 时,它会起作用。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: new ThemeData(
              brightness: Brightness.dark,
              primaryColorBrightness: Brightness.dark,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  // GETTING ACTUAL DATE
  static var _actualDatetimeUnformatted = new DateTime.now();

  // DATETIME OBJECT TOO, LIKE _actualDatetimeUnformatted BUT WITH A FEW DAYS ADDED TO IT (TO GET THE END OF THE WEEK!)
  static var _weekEndDatetimeUnformatted = _actualDatetimeUnformatted.add(
      new Duration(days: getWeekday(_actualDatetimeUnformatted)));  // RED SCREEN MISTAKE SOMEWHERE HERE IN "getWeekday" method!

  // GET MONTH, DAY, YEAR (AS END OF WEEK)
  static getWeekday(_actualDatetimeUnformatted) {
    if (_actualDatetimeUnformatted.weekday == DateTime.monday) {
      return 6;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.tuesday) {
      return 5;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.wednesday) {
      return 4;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.thursday) {
      return 3;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.friday) {
      return 2;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.saturday) {
      return 1;
    } else if (_actualDatetimeUnformatted.weekday == DateTime.sunday) {
      return 0;
    }
  }

  // GET MONTH, DAY (AS START OF WEEK)
  static var formatterWeekdayAll = new DateFormat("MMM d");

  // GET WEEKDAY
  static var formatterDay = new DateFormat("EEEE");

  // GETTING WEEKDAY FOR SELECTED DAY (above the weekdays)
  String _selectedDay = formatterDay.format(_actualDatetimeUnformatted);

  // RETURNING WEEKDAY FOR APP TEXT AS WELL AS END OF WEEK CALCULATED FROM THE DAY OF _WEEKDAY (above the current day (_selectedDay))
  String _Weekday = formatterWeekdayAll.format(_actualDatetimeUnformatted); //WORKS
  String _WeekdayEnd = formatterWeekdayAll.format(_weekEndDatetimeUnformatted);

  String text = "Some Note...";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.black,
        body: ListView(
            children: <Widget>[
              Stack(
                children: <Widget>[
                  Container(
                    height: 380.0,
                  ),
                  ShaderMask(
                      shaderCallback: (rect) {
                        return LinearGradient(
                            begin: Alignment.topCenter,
                            end: Alignment.bottomCenter,
                            colors: [Colors.black, Colors.transparent])
                            .createShader(
                            Rect.fromLTRB(0, 0, rect.width, rect.height));
                      },
                      blendMode: BlendMode.dstIn,
                      child: Image.asset('assets/milchstraße.jpg',
                          height: 300.0, fit: BoxFit.cover)),
                  RotatedBox(
                    quarterTurns: 0,
                    child: Text('Weekly Planner',
                        style: TextStyle(
                            fontSize: 55,
                            fontWeight: FontWeight.bold,
                            color: Colors.white.withOpacity(0.35),
                            letterSpacing: 10.0)),
                  ),
                  Positioned(
                    top: 4.0,
                    right: 4.0,
                    child: Container(
                      height: 40.0,
                      width: 40.0,
                      decoration: BoxDecoration(
                          borderRadius: BorderRadius.circular(20.0),
                          color: Colors.white),
                      child: Center(
                        child: Icon(Icons.menu),
                      ),
                    ),
                  ),
                  Positioned(
                    top: 2.0,
                    right: 5.0,
                    child: Container(
                      height: 12.0,
                      width: 12.0,
                      decoration: BoxDecoration(
                          borderRadius: BorderRadius.circular(6.0),
                          color: Color(0xFFFD3664)),
                    ),
                  ),
                  Positioned(
                      top: 170.0,
                      left: 10.0,
                      child: Column(
                        children: <Widget>[
                          Text("It's week:",
                              style: TextStyle(
                                  fontFamily: 'Oswald-Light',
                                  fontSize: 25.0,
                                  fontWeight: FontWeight.w500,
                                  color: Colors.white))
                        ],
                      )),
                  Positioned(
                      top: 280.0,
                      left: 120.0,
                      child: Column(
                        children: <Widget>[
                          Text("$_selectedDay",
                              style: TextStyle(
                                  fontFamily: 'Oswald-Light',
                                  fontSize: 40.0,
                                  fontWeight: FontWeight.w500,
                                  color: Colors.white))
                        ],
                      )),
                  Positioned(
                      top: 210.0,
                      left: 10.0,
                      child: Column(
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                              Text('From $_Weekday. to $_WeekdayEnd.',
                                  style: TextStyle(
                                      fontFamily: 'Oswald-Light',
                                      fontSize: 35.0,
                                      fontWeight: FontWeight.bold,
                                      color: Color(0xFFFD3664))),
                            ],
                          )
                        ],
                      )),
                ],
              ),
              Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
                _buildWeekDays('Monday', Icons.calendar_today, text),
                _buildWeekDays('Tuesday', Icons.calendar_today, text),
                _buildWeekDays('Wednesday', Icons.calendar_today, text),
                _buildWeekDays('Thursday', Icons.calendar_today, text),
              ]),
              Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
                _buildWeekDays('Friday', Icons.calendar_today, text),
                _buildWeekDays('Saturday', Icons.calendar_today, text),
                _buildWeekDays('Sunday', Icons.calendar_today, text),
              ]),
            ]));
  }

  Widget _buildWeekDays(String day, iconData, text) {
    return InkWell(
      splashColor: Colors.transparent,
      onTap: () {
        _WeekPlanRoute(day, text); // MISTAKE SOMEWHERE IN THIS METHOD!!!
      },
      child: AnimatedContainer(
          curve: Curves.easeIn,
          duration: Duration(microseconds: 300),
          height: _selectedDay == 'day' ? 100.0 : 100.0,
          width: _selectedDay == 'day' ? 100.0 : 75.0,
          color: _selectedDay == 'day' ? Color(0xFFFD3566) : Colors.transparent,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(
                iconData,
                color: _selectedDay == day ? Colors.white : Colors.grey,
                size: 40.0,
              ),
              SizedBox(height: 10.0),
              Text(day,
                  style: TextStyle(
                      fontFamily: 'Oswald-Light',
                      color: _selectedDay == day ? Colors.white : Colors.grey,
                      fontSize: 15.0))
            ],
          )),
    );
  }

  void _WeekPlanRoute(day, text) {
    selectMenuOption(day);
    Navigator.of(context).push(
      MaterialPageRoute<void>(
          builder: (BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text(
                  '$day',
                  textAlign: TextAlign.center,
                  style: TextStyle(
                    fontFamily: 'Oswald-Light',
                    color: Color(0xFFFD3566),
                    fontWeight: FontWeight.bold,
                    fontSize: 35,
                  ),
                ),
              ),
              body: new Container(
                margin: const EdgeInsets.symmetric(
                    horizontal: 10.0, vertical: 5.0),
                padding: const EdgeInsets.symmetric(
                    horizontal: 15.0, vertical: 10.0),
                decoration: new BoxDecoration(
                  color: Colors.green.shade200.withOpacity(0.3),
                  borderRadius: new BorderRadius.circular(5.0),
                ),
                child: new IntrinsicHeight(
                  child: new Row(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      new Container(
                        margin: const EdgeInsets.only(
                            top: 4.0, bottom: 4.0, right: 10.0),
                        child: Text(
                          text, // DYNAMICALLY FOR USERS!
                          textAlign: TextAlign.justify,
                          overflow: TextOverflow.ellipsis,
                          maxLines: 3,
                          style: TextStyle(
                            fontFamily: 'Oswald-Light',
                            fontSize: 20,
                            fontWeight: FontWeight.w200,
                            color: Colors.white,
                          ),
                        ),
                      ),
                      new Container(
                        margin: EdgeInsets.symmetric(horizontal: 5.0),
                        child: InkWell(
                          child: Icon(
                            Icons.star_border,
                            size: 40,
                          ),
                          onTap: () {
                            setToFav(text);
                          },
                          onDoubleTap: () {
                            // DELETE COLOR FROM THE STAR
                            // DELETE IT FROM ARRAY OF IMPORTANT NOTES!
                          },
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            );
          }
      ),
    );
  }

  selectMenuOption(String day) {
    setState(() {
      _selectedDay = day;
    });
  }

  setToFav(String text) {
    setState(() {
      //final bool favourized = _saved.contains(pair)
    });

  }
}

我已经阅读了错误消息,但它对我并没有真正的帮助 xD。我来自 Python 领域,这意味着我熟悉简短、有用的错误消息:D。

I/flutter (28798): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (28798): The following NoSuchMethodError was thrown building Builder:
I/flutter (28798): The getter 'month' was called on null.
I/flutter (28798): Receiver: null
I/flutter (28798): Tried calling: month
I/flutter (28798): User-created ancestor of the error-causing widget was:
I/flutter (28798):   MaterialApp
I/flutter (28798):   file:///C:/Users/tim-a/Desktop/AndroidStudioProjects/Flutter/wochenplaner/lib/main.dart:14:12
I/flutter (28798): When the exception was thrown, this was the stack:
I/flutter (28798): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:50:5)
I/flutter (28798): #1      _DateFormatPatternField.formatMonth (package:intl/src/intl/date_format_field.dart:445:41)
I/flutter (28798): #2      _DateFormatPatternField.formatField (package:intl/src/intl/date_format_field.dart:367:16)
I/flutter (28798): #3      _DateFormatPatternField.format (package:intl/src/intl/date_format_field.dart:244:12)
I/flutter (28798): #4      DateFormat.format.<anonymous closure> (package:intl/src/intl/date_format.dart:255:57)
I/flutter (28798): #5      List.forEach (dart:core-patch/growable_array.dart:278:8)
I/flutter (28798): #6      DateFormat.format (package:intl/src/intl/date_format.dart:255:19)
I/flutter (28798): #7      new _MyHomePageState (package:wochenplaner/main.dart:69:44)
I/flutter (28798): #8      MyHomePage.createState (package:wochenplaner/main.dart:27:37)
I/flutter (28798): #9      new StatefulElement (package:flutter/src/widgets/framework.dart:4016:25)
I/flutter (28798): #10     StatefulWidget.createElement (package:flutter/src/widgets/framework.dart:802:38)
I/flutter (28798): #11     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3091:40)
I/flutter (28798): #12     Element.updateChild (package:flutter/src/widgets/framework.dart:2896:12)
I/flutter (28798): #13     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5119:14)
I/flutter (28798): #14     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3093:14)
I/flutter (28798): #15     Element.updateChild (package:flutter/src/widgets/framework.dart:2896:12)
I/flutter (28798): #16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #17     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #18     StatelessElement.update (package:flutter/src/widgets/framework.dart:4008:5)
I/flutter (28798): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #20     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #21     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #22     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #24     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #25     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #26     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #29     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #30     StatefulElement.update (package:flutter/src/widgets/framework.dart:4112:5)
I/flutter (28798): #31     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #33     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #34     StatelessElement.update (package:flutter/src/widgets/framework.dart:4008:5)
I/flutter (28798): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #37     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #38     StatefulElement.update (package:flutter/src/widgets/framework.dart:4112:5)
I/flutter (28798): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #40     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #41     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #42     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #43     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #44     ProxyElement.update (package:flutter/src/widgets/framework.dart:4246:5)
I/flutter (28798): #45     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:94:11)
I/flutter (28798): #46     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #47     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #48     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #49     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #50     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #51     StatefulElement.update (package:flutter/src/widgets/framework.dart:4112:5)
I/flutter (28798): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #54     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #55     StatelessElement.update (package:flutter/src/widgets/framework.dart:4008:5)
I/flutter (28798): #56     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #57     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5126:14)
I/flutter (28798): #58     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #60     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #61     ProxyElement.update (package:flutter/src/widgets/framework.dart:4246:5)
I/flutter (28798): #62     Element.updateChild (package:flutter/src/widgets/framework.dart:2885:15)
I/flutter (28798): #63     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3953:16)
I/flutter (28798): #64     Element.rebuild (package:flutter/src/widgets/framework.dart:3730:5)
I/flutter (28798): #65     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2340:33)
I/flutter (28798): #66     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:20)
I/flutter (28798): #67     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter (28798): #68     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1033:15)
I/flutter (28798): #69     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:975:9)
I/flutter (28798): #70     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:784:7)
I/flutter (28798): #72     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:382:19)
I/flutter (28798): #73     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:416:5)
I/flutter (28798): #74     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
I/flutter (28798): (elided one frame from package dart:async-patch)
I/flutter (28798): ════════════════════════════════════════════════════════════════════════════════════════════════════

我不明白为什么它说我是The getter 'month' was called on null,即使我在getWeekday 中什至不使用月份。

提前非常感谢!

【问题讨论】:

  • The getter 'month' was called on null 表示null 某处最终被传递为DateTime,并且某些东西试图访问其month 成员。我建议您添加asserts 以​​验证事情不是null,当您不期望时。
  • 我自己运行应用程序,点击底部区域的按钮时没有发现错误。这是演示imgur.com/a/UjRM5tP。我使用 intl: ^0.15.8 和 dart 2.4.1
  • @jamesdlin 感谢您的解释...我将通过代码搜索自己并尝试找出试图访问month 成员的内容。您是否建议在 getWeekday 方法中添加 asserts?我怎么能做到这一点?感谢您的帮助!
  • @ejabu 我也试过了,由于一些奇怪的原因它现在可以工作了......让我们等到明天看看它是否也能工作。 xD

标签: android-studio datetime flutter dart


【解决方案1】:

您可能不会将此作为答案,但更多的是,例如在您的代码中删除一些样板。为此,我会推荐你​​试试这个包,Jiffy。它是一个受momentjs启发的日期格式包

周末结束

var _weekEndDatetimeUnformatted = Jiffy().endOf(Units.WEEK);

// You can also pass a DateTime object
var _weekEndDatetimeUnformatted = Jiffy(DateTime.now()).endOf(Units.WEEK);

// And in your case
var _weekEndDatetimeUnformatted = Jiffy(_actualDatetimeUnformatted).endOf(Units.WEEK);

格式化。

var _selectedDay = Jiffy(_actualDatetimeUnformatted).format("EEEE");
var _Weekday = Jiffy(_actualDatetimeUnformatted).format("MMM d");

// You can also use default formats
var formatterDay = Jiffy(_actualDatetimeUnformatted).EEEE; // e.g Monday

对于_WeekdayEnd,您可以尝试两个选项

//User the _weekEndDatetimeUnformatted Datetime Object
var _WeekdayEnd = Jiffy(_weekEndDatetimeUnformatted).format("MMM d");

// Or use method cascading which returns a Jiffy instance. 
// Advantage is that Jiffy has more functionality than DateTime
var _weekEndDatetimeUnformatted = Jiffy().endOf(Units.WEEK);
var _WeekdayEnd = _weekEndDatetimeUnformatted.format("MMM d");

希望这有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2021-12-31
    • 2016-03-17
    • 2010-09-11
    • 2019-12-06
    • 2020-12-15
    相关资源
    最近更新 更多