Flutter:类型不匹配:推断的类型是字符串?但字符串是预期的

问题描述

我是编码新手。我在我的项目中使用 upi_pay 包来使 UPI 付款出现错误,因为“类型不匹配:推断类型是字符串?但字符串是预期的”,当我尝试构建应用程序时

我关注了这篇文章https://dev.to/dsc_ciet/adding-upi-payment-gateway-in-flutter-376c

我是编码新手,如果这很容易,请不要介意。

请通过下面的代码

提前致谢

class PaymentScreen extends StatefulWidget {
  @override
  _PaymentScreenState createState() => _PaymentScreenState();
}

class _PaymentScreenState extends State<PaymentScreen> {
  String _upiAddrError;

  final _upiAddressController = TextEditingController();
  final _amountController = TextEditingController();

  bool _isUpiEditable = false;

  Future<List<ApplicationMeta>> _appsFuture;

  @override
  void initState() {
    _amountController.text =
        (Random.secure().nextDouble() * 10).toStringAsFixed(2);
    _appsFuture = UpiPay.getInstalledUpiApplications();

    super.initState();
  }

 
  void _generateAmount() {
    setState(() {
      _amountController.text =
          (Random.secure().nextDouble() * 10).toStringAsFixed(2);
    });
  }

  Future<void> _onTap(ApplicationMeta app) async {
    final err = _validateUpiAddress(_upiAddressController.text);
    if (err != null) {
      setState(() {
        _upiAddrError = err;
      });
      return;
    }
    setState(() {
      _upiAddrError = null;
    });

    final transactionRef = Random.secure().nextInt(1 << 32).toString();

    print("Starting transaction with is $transactionRef");

    final a = await UpiPay.initiateTransaction(
      amount: _amountController.text,app: app.upiApplication,receiverName: "Sharad",receiverUpiAddress: _upiAddressController.text,transactionRef: transactionRef,merchantCode: '7372',);
    print(a);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 16),child: ListView(
            children: <Widget>[
              Container(
                margin: EdgeInsets.only(top: 32),child: Row(
                  children: <Widget>[
                    Expanded(
                      child: TextFormField(
                        controller: _upiAddressController,enabled: _isUpiEditable,decoration: Inputdecoration(
                          border: OutlineInputBorder(),hintText: 'address@upi',labelText: 'Receiving UPI Address',),Container(
                      margin: EdgeInsets.only(left: 8),child: IconButton(
                        icon: Icon(
                          _isUpiEditable ? Icons.check : Icons.edit,onpressed: () {
                          setState(() {
                            _isUpiEditable = !_isUpiEditable;
                          });
                        },],if (_upiAddrError != null)
                Container(
                  margin: EdgeInsets.only(top: 4,left: 12),child: Text(
                    _upiAddrError,style: TextStyle(color: Colors.red),Container(
                margin: EdgeInsets.only(top: 32),child: Row(
                  children: <Widget>[
                    Expanded(
                      child: TextField(
                        controller: _amountController,readOnly: true,enabled: false,labelText: 'Amount',child: IconButton(
                        icon: Icon(Icons.loop),onpressed: _generateAmount,Container(
                margin: EdgeInsets.only(top: 128,bottom: 32),child: Column(
                  mainAxisSize: MainAxisSize.min,children: <Widget>[
                    Container(
                      margin: EdgeInsets.only(bottom: 12),child: Text(
                        'Pay Using',style: Theme.of(context).textTheme.caption,FutureBuilder<List<ApplicationMeta>>(
                      future: _appsFuture,builder: (context,snapshot) {
                        if (snapshot.connectionState != ConnectionState.done) {
                          return Container();
                        }

                        return GridView.count(
                          crossAxisCount: 2,shrinkWrap: true,mainAxisspacing: 8,crossAxisspacing: 8,childAspectRatio: 1.6,physics: NeverScrollableScrollPhysics(),children: snapshot.data
                              .map((it) => Material(
                                    key: ObjectKey(it.upiApplication),color: Colors.grey[200],child: InkWell(
                                      onTap: () => _onTap(it),child: Column(
                                        mainAxisSize: MainAxisSize.min,mainAxisAlignment:
                                            MainAxisAlignment.center,children: <Widget>[
                                          Image.memory(
                                            it.icon,width: 64,height: 64,Container(
                                            margin: EdgeInsets.only(top: 4),child: Text(
                                              it.upiApplication.getAppName(),))
                              .toList(),);
                      },)
            ],);
  }
}

String _validateUpiAddress(String value) {
  if (value.isEmpty) {
    return 'UPI Address is required.';
  }

  if (!UpiPay.checkIfUpiAddressIsValid(value)) {
    return 'UPI Address is invalid.';
  }

  return null;
}

解决方法

您将 null 分配给 _upiAddrError,但它是一个不可为空的字符串。

将该变量声明为 String? _upiAddrError 而不是 String _upiAddrError 以使其可为空。