Flutter:如何将 setState 变量作为参数出现
Flutter : How to setState variable comes as arguments
我有这个页面从上一页接收参数变量 (weekId),我想在按下按钮图标后更改此值以增加或减少它。
我做到了,但是当页面重建时,它再次采用接收到的参数变量值。
我该如何修复它:
class PreDetail extends StatefulWidget {
@override
_PreDetailState createState() => _PreDetailState();
}
class _PreDetailState extends State<PreDetail> {
var weekId;
@override
Widget build(BuildContext context) {
List preData = [];
Map rdata = ModalRoute.of(context).settings.arguments;
var userName = rdata['username'];
var weekId = rdata['week_id'];
//ok
var mywidth = MediaQuery.of(context).size.width;
Future<List> get_week_pre() async {
print('weekId = $weekId'); -----------// variable I want to setState
try {
//ok
var url =
'https://technosat-iq.com/myexpect/api/controller/matchs/pre_week.php?username=$userName&week_id=$weekId';
var response = await http.get(url);
var data = await jsonDecode(response.body);
print(data);
for (var x in data) {
WeekPre preList = WeekPre(
x['username'],
preData.add(preList);
}
return preData;
} catch (Expection) {
print(Expection);
}
}
return FutureBuilder(
future: get_week_pre(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.none ||
snapshot.data == null) {
return Center(
child: CircularProgressIndicator(strokeWidth: 6.0),
);
} else {
return Scaffold(
appBar: AppBar(
title: Text('Points Detail'),
centerTitle: true,
backgroundColor: Colors.orange[800],
),
body: Container(
child: ListView(
children: [
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 50,
width: 0.2 * mywidth,
child: IconButton(
alignment: Alignment.center,
icon: Icon(
Icons.arrow_right,
size: 50,
color: Colors.pink[800],
),
onPressed: () {
weekId = int.parse(weekId);
setState(() {
weekId++; -------------// here I want to setState
});
print(weekId);
}),
),],)],),));}},);}}
可以在构建上下文之外接收参数吗?
您有 2 个问题:
您在构建方法中启动了 weekId。修复:添加 initState 然后在其中启动 weekId。 https://api.flutter.dev/flutter/widgets/State/initState.html
您没有设置状态变量,而是在构建方法中创建了一个新的局部变量 weekId。修复:删除方法中weekId前的var关键字。
@override
void initState(){
super.initState();
SchedulerBinding.instance.addPostFrameCallback((Duration _) async {
Map rdata = ModalRoute.of(context).settings.arguments;
var userName = rdata['username'];
weekId = rdata['week_id'];
setState((){});
});
}
@override
Widget build(BuildContext context) { ... }
不过还有更简单的方法。选择权在你:
class PreDetail extends StatefulWidget {
final String weekId;
@override
_PreDetail State
const PreDetail({Key key, @required this.weekId}) : super(key: key);createState() => _PreDetail State();
}
class _PreDetail State extends State<PreDetail > {
@override
Widget build(BuildContext context) {
return Text(
widget.weekId,
);
}
}
我有这个页面从上一页接收参数变量 (weekId),我想在按下按钮图标后更改此值以增加或减少它。 我做到了,但是当页面重建时,它再次采用接收到的参数变量值。 我该如何修复它:
class PreDetail extends StatefulWidget {
@override
_PreDetailState createState() => _PreDetailState();
}
class _PreDetailState extends State<PreDetail> {
var weekId;
@override
Widget build(BuildContext context) {
List preData = [];
Map rdata = ModalRoute.of(context).settings.arguments;
var userName = rdata['username'];
var weekId = rdata['week_id'];
//ok
var mywidth = MediaQuery.of(context).size.width;
Future<List> get_week_pre() async {
print('weekId = $weekId'); -----------// variable I want to setState
try {
//ok
var url =
'https://technosat-iq.com/myexpect/api/controller/matchs/pre_week.php?username=$userName&week_id=$weekId';
var response = await http.get(url);
var data = await jsonDecode(response.body);
print(data);
for (var x in data) {
WeekPre preList = WeekPre(
x['username'],
preData.add(preList);
}
return preData;
} catch (Expection) {
print(Expection);
}
}
return FutureBuilder(
future: get_week_pre(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.none ||
snapshot.data == null) {
return Center(
child: CircularProgressIndicator(strokeWidth: 6.0),
);
} else {
return Scaffold(
appBar: AppBar(
title: Text('Points Detail'),
centerTitle: true,
backgroundColor: Colors.orange[800],
),
body: Container(
child: ListView(
children: [
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 50,
width: 0.2 * mywidth,
child: IconButton(
alignment: Alignment.center,
icon: Icon(
Icons.arrow_right,
size: 50,
color: Colors.pink[800],
),
onPressed: () {
weekId = int.parse(weekId);
setState(() {
weekId++; -------------// here I want to setState
});
print(weekId);
}),
),],)],),));}},);}}
可以在构建上下文之外接收参数吗?
您有 2 个问题:
您在构建方法中启动了 weekId。修复:添加 initState 然后在其中启动 weekId。 https://api.flutter.dev/flutter/widgets/State/initState.html
您没有设置状态变量,而是在构建方法中创建了一个新的局部变量 weekId。修复:删除方法中weekId前的var关键字。
@override void initState(){ super.initState(); SchedulerBinding.instance.addPostFrameCallback((Duration _) async { Map rdata = ModalRoute.of(context).settings.arguments; var userName = rdata['username']; weekId = rdata['week_id']; setState((){}); }); } @override Widget build(BuildContext context) { ... }
不过还有更简单的方法。选择权在你:
class PreDetail extends StatefulWidget {
final String weekId;
@override
_PreDetail State
const PreDetail({Key key, @required this.weekId}) : super(key: key);createState() => _PreDetail State();
}
class _PreDetail State extends State<PreDetail > {
@override
Widget build(BuildContext context) {
return Text(
widget.weekId,
);
}
}