【问题标题】:Flutter : How to setState variable comes as argumentsFlutter:如何设置状态变量作为参数
【发布时间】:2020-09-11 11:48:49
【问题描述】:

我有这个页面,它从上一页接收一个参数变量(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);
                              }),
                        ),],)],),));}},);}}

可以在构建上下文之外接收参数吗?

【问题讨论】:

    标签: flutter dart arguments setstate


    【解决方案1】:

    你有两个问题:

    • 您在 build 方法中启动 weekId。修复:添加 initState 然后在其中启动 weekId。 https://api.flutter.dev/flutter/widgets/State/initState.html

    • 您不设置状态变量,而是在 build 方法中创建一个新的局部变量 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,
        );
      }
    }
    

    【讨论】:

    • 谢谢先生,问题是我在构建上下文中收到参数,在外面收到初始状态,我该怎么做
    • 我这样做了,但我得到了错误:在构建 Builder 时抛出了以下断言:在 _PreDetailState.initState() 完成之前调用了dependOnInheritedWidgetOfExactType<_modalscopestatus>() 或dependOnInheritedElement()。当继承的小部件发生变化时,例如如果 Theme.of() 的值发生变化,它的依赖项
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 2017-06-16
    • 2019-04-28
    • 1970-01-01
    • 2021-01-24
    • 2022-01-05
    • 2022-01-21
    • 2022-12-19
    相关资源
    最近更新 更多