4

I declare a class variable for a StatefulWidget - in the code below it's someString. Is it possible to use this variable in the build(…)-method without declaring it as static?

class MyClass extends StatefulWidget {
  String someString;
  MyClass() {
    this.someString = "foo";
  }
  @override
  _MyClassState createState() => _MyClassState();
}

class _MyClassState extends State<MyClass> {
  _MyClassState();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("someString - how to access it here?!"),
        // title: Text(someString), is not possible, obviously
      ),
    );
  }
}

Thanks in advance for help!

1
  • 5
    you can directly access it like this Text(widget.someString); Commented Feb 16, 2021 at 0:32

1 Answer 1

7

Attention: MyClass should be immutable.

1. If someString will never change

Keep it inside MyClass but define it as final.

class MyClass extends StatefulWidget {
  final String someString;

  const MyClass({Key key, this.someString = 'foo'}) : super(key: key);

  @override
  _MyClassState createState() => _MyClassState();
}

Then, inside the State, you can use it as widget.someString:

class _MyClassState extends State<MyClass> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('${widget.someString} is accessed here?!')),
    );
  }
}

2. If someString will change

It should be defined in the state.

class MyClass extends StatefulWidget {
  final String initialValue;

  const MyClass({Key key, this.initialValue = 'foo'}) : super(key: key);

  @override
  _MyClassState createState() => _MyClassState();
}

class _MyClassState extends State<MyClass> {
  String someString;

  @override
  void initState() {
    someString = widget.initialValue;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('$someString is accessed here?!')),
      body: Center(
        child: OutlinedButton(
          onPressed: () => setState(() => someString = 'NEW Value'),
          child: Text('Update value'),
        ),
      ),
    );
  }
}

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks, Thierry, this is was extremely helpful! If someString will change - how is it possible to pass it to the State via the constructor?
Is it changing within the MyClass widget or only from ancestors in the Widget Tree?
In the MyClass widget.
MyClass(initialValue: 'Azerty')

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.