Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter / Dart: StatefulWidget - access class variable inside Widget

Tags:

static

flutter

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!

like image 950
BNetz Avatar asked Oct 14 '25 08:10

BNetz


1 Answers

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

like image 150
Thierry Avatar answered Oct 17 '25 02:10

Thierry



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!