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,
    );
  }
}