如何解决在 Flutter 中以函数为参数调用小部件
我正在尝试调用具有函数作为参数的自定义小部件,但是我不知道可以为其分配什么参数。我已经测试了我想出的所有想法,但没有成功。这个想法是我从教程中获得的,但是我做了一些不同的事情,因为我有不同的要求。 这是我的代码:
import 'package:Flutter/material.dart';
class NewTransaction extends StatelessWidget {
final Function addTx;
const NewTransaction({Key? key,required this.addTx}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text('I cant solve this problem');
}
}
================================================ ==========================
import 'package:Flutter/material.dart';
import 'package:function_parameter_problem/new_transaction.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,),home: MyHomePage(title: 'Flutter Demo Home Page'),);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key,required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
NewTransaction(
addTx:
addTx),// What parameter can/should I pass here? It is crucial for my project
],floatingActionButton: FloatingActionButton(
onpressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
编辑:好的,但假设 NewTransaction()
函数返回一个带有 appbar 等的脚手架,我必须再次调用它,但是在以下情况下:
_wykonajZapytanie() { //function called onpressed in the main window
Navigator.push(
context,MaterialPageRoute(builder: (context) => NewTransaction()),); /*I have to put a parameter here,but I just want to display another window,I don't kNow why,but I just can't get any ideas*/
}
重要提示 在原始项目中,如果涉及到我提供的第一个示例,我不会在主类中调用 NewTransaction(addTx...),而是在 UserTransaction 类中.
tldr 我需要在主类中组装一个可扩展的列表 - 根据我所知道的,可以按照以下方式完成,但我还需要在主类中调用此函数按下按钮以显示所有文本字段等
import 'package:Flutter/material.dart';
import './new_transaction.dart';
import './transaction_list.dart';
import '../models/transaction.dart';
class UserTransaction extends StatefulWidget {
@override
_UserTransactionState createState() => _UserTransactionState();
}
class _UserTransactionState extends State<UserTransaction> {
final List<Transaction> _userTransactions = [
Transaction(
id: 1,date: DateTime.Now(),numTel: 911911911,// scoring: 'Link wygasł',user: 'Polizei pau pau'),Transaction(
id: 2,user: 'Tha police')
];
void _addNewTransaction(int txnumTel,/* String txScoring,*/ String txUser) {
final newTx = Transaction(
numTel: txnumTel,/*scoring: txScoring,*/
user: 'PLZ WORK',id: 3,);
setState(() {
_userTransactions.add(newTx);
});
}
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
NewTransaction(_addNewTransaction),]);
}
}
解决方法
如果我正确理解了您的问题,那么您可以通过以下方式传递带参数的函数:
import 'package:flutter/material.dart';
class NewTransaction extends StatelessWidget {
final Function() addTx;
const NewTransaction({Key? key,required this.addTx}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text('I cant solve this problem');
}
}
传递此函数时,请确保像这样传递它:NewTransaction(addTx: () => addTx());
。如果您像这样传递它:NewTransaction(addTx: addTx());
函数会立即被调用。
import 'package:flutter/material.dart';
class NewTransaction extends StatelessWidget {
final VoidCallback function;
//if nothing returns
//else typedef CustomFunc = Function(int param); (replace int with your data type)
const NewTransaction({Key? key,required this.function}) : super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
child: Text('I cant solve this problem'),onTap:function,//if custom
//onTap: (){
// function(params);
//}
);
}
}
Call like below...
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
NewTransaction(
function: (){
//todo
},//if custome function: (params){ todo },)
],),
,
当您说Function addTx
时,表示可以传递任何函数。
如果 Function() addTx
表示没有参数的函数。
如果 Function(int) addTx
表示具有一个必需的位置参数整数的函数。
如果 void Function() addTx
表示没有参数的函数,返回类型应该是 void。
在颤振中你也可以使用
VoidCallback
基本上是这样写的 void Function()
final VoidCallback addTd
。
.
或者可以使用 ValueChanged<T>
基本上是 void Function(T value)
更多信息请访问: https://dart.dev/guides/language/language-tour#functions
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。