Невозможно работать с виджетом с отслеживанием состояния Flutter

#flutter #dart #setstate #statefulwidget #flutter-state

#flutter #dart #setstate #statefulwidget #состояние flutter

Вопрос:

Я Рави. Я в значительной степени новичок в Flutter, но я не новичок в программировании. Я застрял, работая с виджетами Flutter с отслеживанием состояния. Поскольку я новичок в этом SDK, я не могу понять, почему мое состояние не обновляется. Я просто написал некоторый код, который увеличивал бы число при каждом нажатии кнопки, и я знал, что мы должны использовать виджеты с отслеживанием состояния, чтобы обновлять любые данные в режиме реального времени. но мой код работает не так, как должен. Кто-нибудь может мне помочь с этим.

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
int level = 0;
return MaterialApp(
  home: Scaffold(
      appBar: AppBar(
        title: Text('Stateful Widget'),
      ),
      body: Center(
        child: Column(
          children: [
            Text('$level'),
            RaisedButton(
              child: Text('Increment'),
              onPressed: () {
                setState(() {
                  level = level   1;
                  print(level);
                });
              },
            ),
          ],
        ),
      )),
);
}
}

Console: 
Performing hot reload...
Syncing files to device sdk gphone x86 arm...
Reloaded 1 of 513 libraries in 1,722ms.
I/flutter ( 8886): 1
  

Демонстрация виджета с отслеживанием состояния Flutter

Ответ №1:

Проблема связана с областью действия вашей level переменной. Это должно быть не в вашем build методе, а в вашем class

 class _MyAppState extends State<MyApp> {
//Moved level here.
  int level = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stateful Widget'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('$level'),
              RaisedButton(
                child: Text('Increment'),
                onPressed: () {
                  setState(() {
                    level = level   1;
                    print(level);
                  });
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}
  

Комментарии:

1. точно, потому что, когда вы вызываете метод, setState() он вызывает build() метод, поэтому level переменной возвращается значение 0.