在 null 上调用了 getter '_controller'。扑

Posted

技术标签:

【中文标题】在 null 上调用了 getter \'_controller\'。扑【英文标题】:The getter '_controller' was called on null. Flutter在 null 上调用了 getter '_controller'。扑 【发布时间】:2021-06-11 12:17:37 【问题描述】:

我在 Flutter 中使用这个包:https://pub.dev/packages/circular_countdown_timer

但是,我需要创建一个单独的小部件来稍微分离我的代码。我创造了这样的东西:

import 'package:circular_countdown_timer/circular_countdown_timer.dart';
import 'package:flutter/material.dart';

class CustomOtpCard extends StatefulWidget 
  final String duration;
  final String accountName;
  final String otp;
  final Function(CountDownController) onComplete;

  CustomOtpCard(
    @required this.duration,
    @required this.accountName,
    @required this.otp,
    @required this.onComplete,
  );

  @override
  _CustomOtpCardState createState() => _CustomOtpCardState();


class _CustomOtpCardState extends State<CustomOtpCard> 
  CountDownController _controller = CountDownController();

  @override
  Widget build(BuildContext context) 
    return Card(
      child: ListTile(
        leading: CircularCountDownTimer(
          duration: int.parse(widget.duration),
          onComplete: widget.onComplete(_controller),
          initialDuration: 0,
          ringColor: Colors.grey[300],
          fillColor: Colors.purple,
          backgroundColor: Colors.purple[500],
          width: 50.0,
          height: 50.0,
        ),
        title: Text(widget.accountName),
        subtitle: Text(widget.otp),
      ),
    );
  


现在,我是这样使用它的:

return ListView.builder(
                itemCount: _totpItems.length,
                itemBuilder: (context, index) 
                  return CustomOtpCard(
                    duration: '30',
                    onComplete: (controller) 
                      BlocProvider.of<TotpGeneratorBloc>(context)
                          .add(GetTotpItemsEvent());

                      controller.restart();
                    ,
                    accountName: _totpItems[index].accountName,
                    otp: _totpItems[index].otp,
                  );
                ,
              );

然后错误显示“在 null 上调用了 getter '_controller'。”。这是我的错误的图像:

它说,我传递给回调的 _controller 是空的。我究竟做错了什么?谁能给我一个提示?

谢谢!

【问题讨论】:

【参考方案1】:

我假设当您调用controller.restart() 时,_CustomOtpCardState 已被处理,然后_controller 不再存在。

你可以这样做:

首先将onComplete 转为VoidCallback(相当于void Function()):

final VoidCallback onComplete;

那就这样用吧:

...
duration: int.parse(widget.duration),
onComplete: () 
    widget.onComplete();
    _controller.restart();
,
initialDuration: 0,
...

在你的ListView.builder

return CustomOtpCard(
   duration: '30',
   onComplete: () 
       BlocProvider.of<TotpGeneratorBloc>(context)
            .add(GetTotpItemsEvent());
   ,
   accountName: _totpItems[index].accountName,
   otp: _totpItems[index].otp,
);

【讨论】:

不,它不起作用。 onComplete 回调不会触发 BlocProvider。 当我触发 BlocProvider 时,它显示了同样的错误:“getter '_controller' was called on null”。 您的错误是否有任何堆栈跟踪? 好吧,我找到了罪魁祸首。我忘记将控制器参数添加到 CircularCountDownTimer。

以上是关于在 null 上调用了 getter '_controller'。扑的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Singleton数据,getter调用null

在 null 上调用了 getter 'user'

例外:NoSuchMethodError:在 null 上调用了 getter 'uid'。接收方:null 尝试调用:uid

在 null 上调用了 getter 'keys'

错误“在 null 上调用了 getter 'userEmail'

如何修复“在 null 上调用了 getter “文档”。飘飘然