Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:如何从单独的小部件方法调用onPressed()中的setState()_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 颤振:如何从单独的小部件方法调用onPressed()中的setState()

Flutter 颤振:如何从单独的小部件方法调用onPressed()中的setState(),flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我不熟悉这个flatter 我试图在按下on时更改FlatButton文本。我的页面设计使用单独的小部件方法,因此无法在on中添加setState() 我找了很多。但是,找不到。请在这方面帮助我 import 'package:flutter/material.dart'; int number = 10; class SecondRoute extends StatelessWidget { Widget build(BuildContext context) { return

我不熟悉这个
flatter

我试图在按下
on
时更改
FlatButton
文本。我的页面设计使用单独的
小部件
方法,因此无法在
on中添加
setState()

我找了很多。但是,找不到。请在这方面帮助我

import 'package:flutter/material.dart';

int number = 10;

class SecondRoute extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Lists'),
        backgroundColor: new Color(0xFF000000),
      ),
      body: DynamicChange(),
    );
  }
}

class DynamicChange extends StatefulWidget {
  @override
  StateDynamic createState() => StateDynamic();
} // Class SecondRoute

class StateDynamic extends State<DynamicChange> {
  Widget build(BuildContext context) {
    return new Scaffold(
      body: thisScreenNeeds(),
    );
  }
}

Widget thisScreenNeeds() {
  return Container(
    margin: EdgeInsets.only(top: 100, left: 50),
      child: FlatButton(
    child: Text(
      number.toString(),
      textAlign: TextAlign.center,
      style: (TextStyle(
          fontWeight: FontWeight.bold, fontSize: 60, color: Colors.green)),
    ),
    onPressed: () {
       // Unable to add, setState(). Throwing error.
    },
  ));
}
尝试2

class StateDynamic extends State<DynamicChange> {

.....
.........

void _incrementCounter() {
    setState(() {
      number++;
    });
  }

.....
.......

}

onPressed: StateDynamic()._incrementCounter,

// Run Time Error: 
   This happens when you call setState() on a State object for a 
   widget that hasn't been inserted into the widget tree yet. 
   It is not necessary to call setState() in the constructor, 
   since the state is already assumed to be dirty when it is 
   initially created.
类状态动态扩展状态{
.....
.........
void _incrementCounter(){
设置状态(){
数字++;
});
}
.....
.......
}
onPressed:StateDynamic()。\u递增计数器,
//运行时错误:
当您对状态对象调用setState()以获取
尚未插入小部件树的小部件。
无需在构造函数中调用setState(),
因为当状态为“脏”时,它已经被假定为“脏”
最初创建的。

将方法保留在
状态
类中。另外,最好将
number
变量也保留在该类中。您只能在
State
类中直接设置State,这就是原因

在您的情况下,解决方案

class SecondRoute extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Lists'),
        backgroundColor: new Color(0xFF000000),
      ),
      body: DynamicChange(),
    );
  }
}

class DynamicChange extends StatefulWidget {
  @override
  StateDynamic createState() => StateDynamic();
} // Class SecondRoute

class StateDynamic extends State<DynamicChange> {
  int number = 10;

  Widget build(BuildContext context) {
    return new Scaffold(
      body: thisScreenNeeds(),
    );
  }

  Widget thisScreenNeeds() {
    return Container(
        margin: EdgeInsets.only(top: 100, left: 50),
        child: FlatButton(
          child: Text(
            number.toString(),
            textAlign: TextAlign.center,
            style: (TextStyle(
                fontWeight: FontWeight.bold,
                fontSize: 60,
                color: Colors.green)),
          ),
          onPressed: () {
            setState(() {
              number++;
            });
          },
        ));
  }
}

将方法保留在
状态
类中。另外,最好将
number
变量也保留在该类中。您只能在
State
类中直接设置State,这就是原因

在您的情况下,解决方案

class SecondRoute extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Lists'),
        backgroundColor: new Color(0xFF000000),
      ),
      body: DynamicChange(),
    );
  }
}

class DynamicChange extends StatefulWidget {
  @override
  StateDynamic createState() => StateDynamic();
} // Class SecondRoute

class StateDynamic extends State<DynamicChange> {
  int number = 10;

  Widget build(BuildContext context) {
    return new Scaffold(
      body: thisScreenNeeds(),
    );
  }

  Widget thisScreenNeeds() {
    return Container(
        margin: EdgeInsets.only(top: 100, left: 50),
        child: FlatButton(
          child: Text(
            number.toString(),
            textAlign: TextAlign.center,
            style: (TextStyle(
                fontWeight: FontWeight.bold,
                fontSize: 60,
                color: Colors.green)),
          ),
          onPressed: () {
            setState(() {
              number++;
            });
          },
        ));
  }
}

Widget thisScreenNeeds(){return Container();},我已经为按钮使用了单独的小部件。行吗?试试看。回调在开始时可能会混淆,但它非常简单。Widget ThisScreenRequireds(){return Container();},这是错误的吗?@McDonal_11是的,很抱歉我没有完全阅读您的问题,答案主要基于主题,解决方法其实很简单。现在我来分享一下。那么,不是Widget thisScreenNeeds(),而是类ButtonWidget扩展了无状态Widget{},这种方式合适吗?请在这个.Widget thisScreenNeeds(){return Container();}中澄清我的问题,我已经为按钮使用了单独的小部件。行吗?试试看。回调在开始时可能会混淆,但它非常简单。Widget ThisScreenRequireds(){return Container();},这是错误的吗?@McDonal_11是的,很抱歉我没有完全阅读您的问题,答案主要基于主题,解决方法其实很简单。现在我来分享一下。那么,不是Widget thisScreenNeeds(),而是类ButtonWidget扩展了无状态Widget{},这种方式合适吗?请澄清这一点。
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String text = 'Some text';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Text(text),
          ButtonWidget(stateSetter),
        ],
      ),
    );
  }

  void stateSetter() {
    setState(() {
      text = 'Changed text';
    });
  }
}

class ButtonWidget extends StatelessWidget {
  final VoidCallback stateSetter;

  ButtonWidget(this.stateSetter);

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: this.stateSetter,
    );
  }
}