问题描述
我是编码新手。我在我的项目中使用 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
以使其可为空。