我試圖在 Flutter 中制作星形圖案生成器。我將資料從子小部件的回呼函式中的 int 型別傳遞:Textfield Widget 到父 Widget CustomBarWidget,然后到 Toplevel 父 Widget RootPage。
在文本欄位中,我在行出現錯誤:
onChanged: widget.onChange,
錯誤說:引數型別“動態函式(int)”不能分配給引數型別void函式(字串)?
這是完整的代碼:
根頁:
class RootPage extends StatefulWidget {
const RootPage({super.key});
@override
State<RootPage> createState() => _RootPageState();
}
class _RootPageState extends State<RootPage> {
int data = 5;
void getData(int newNumb) {
setState(() {
data = newNumb;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomBarWidget(sendData: getData),
body: StarTriangleWidget(data: data),
);
}
}
自定義欄小部件:
class CustomBarWidget extends StatefulWidget implements PreferredSizeWidget {
const CustomBarWidget({super.key, this.sendData});
final sendData;
@override
Size get preferredSize => const Size.fromHeight(70.0);
@override
State<CustomBarWidget> createState() => _CustomBarWidgetState();
}
class _CustomBarWidgetState extends State<CustomBarWidget> {
int data = 0;
@override
Widget build(BuildContext context) {
return AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
title: Row(
children: <Widget>[
TextfielWidget(onChange: (val) {
widget.sendData(val);
}),
ElevatedButton(
onPressed: () {
debugPrint("click");
},
style: ElevatedButton.styleFrom(
padding:
const EdgeInsets.symmetric(horizontal: 40.0, vertical: 15.0),
shape: const StadiumBorder(),
),
child: const Text(
"Enter",
style: TextStyle(color: Colors.white, fontSize: 18),
),
),
],
),
);
}
}
文本欄位小部件:
class TextfielWidget extends StatefulWidget {
final Function(int) onChange;
const TextfielWidget({super.key, required this.onChange});
@override
State<TextfielWidget> createState() => _TextfielWidgetState();
}
class _TextfielWidgetState extends State<TextfielWidget> {
@override
Widget build(BuildContext context) {
return Flexible(
child: TextField(
onChanged: widget.onChange,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Enter Number',
)
)
);
}
}
我在哪里可以更改“void Function(String)?”的型別?我找不到問題,問題是文本欄位本身嗎?
謝謝你的幫助
uj5u.com熱心網友回復:
的onChanged屬性TextField接受 a void Function(String)?,但是widget.onChange您分配給它的屬性回傳 aFunction(int)并且它并非void如此 dart 期望回傳一些東西并像處理它一樣dynamic Function(int),所以解決方案是:
改變這個:
final Function(int) onChange;
有了這個:
final void Function(String)? onChange;
現在你說從 is 得到的值TextField,String我知道你需要從你在應用程式中執行的任務中獲取一個數字,所以每當你有一個String包含數字的時候,"120"你可以將它轉換int為120with :
int parsedNumber = int.parse("120"); // 120
您在onChanged屬性中的實作如下所示:
TextfielWidget(onChange: (val) {
widget.sendData(val);
}),
這里val應該是String,但你可以決議它,這樣它就可以int在這樣的sendData方法中:
TextfielWidget(onChange: (val) {
widget.sendData(int.parse(val));
}),
現在可以正常作業了。
注意:int.parse(val)如果val只包含數字,它將正常作業,否則,Exception
如果你想要它會拋出一個如果有問題它會回傳 null 代替 int.tryParse(val);
希望這可以幫助。
uj5u.com熱心網友回復:
TextField 的onChanged屬性是 type void Function(String)not void Function(int)。更改所有函式型別并將字串轉換為 int:
int data = 5;
void getData(String newNumb) {
setState(() {
data = int.tryParse(newNumb);
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523374.html
標籤:扑镖
