Жизненный цикл в трепете

Есть ли у флаттера метод, подобный Activity.resume(), который может сообщить разработчику, что пользователь вернулся к действию.

Когда я выбираю данные из Интернета на странице B и возвращаюсь к странице A, как я могу сообщить странице A, что данные подготовлены.

Ответ 1

  1. createState(): когда Framework получает указание создать StatefulWidget, он немедленно вызывает createState()

  2. mount is true: когда createState создает ваш класс состояний, buildContext назначается этому состоянию. BuildContext - это чрезмерно упрощенное место в дереве виджетов, в котором размещен этот виджет. Здесь более длинное объяснение. Все виджеты имеют свойство bool this.mounting. Он становится истинным, когда назначен buildContext. Ошибка вызывать setState, когда виджет отключен.

  3. initState(): это первый метод, вызываемый при создании виджета (конечно, после конструктора класса). initState вызывается один раз и только один раз. Он должен называться super.initState().

  4. didChangeDependencies(): этот метод вызывается сразу после initState при первом построении виджета.

  5. build(): этот метод вызывается часто. Это необходимо, и он должен вернуть виджет.

  6. didUpdateWidget (Widget oldWidget): если родительский виджет изменяется и должен перестраивать этот виджет (потому что ему нужно предоставить ему другие данные), но он перестраивается с тем же runtimeType, тогда вызывается этот метод. Это потому, что Flutter повторно использует состояние, которое долгое время жил. В этом случае вы можете снова инициализировать некоторые данные, как в initState.

  7. setState(): этот метод часто вызывается из самого фреймворка и от разработчика. Используется для уведомления структуры об изменении данных

  8. deactivate(): Деактивация вызывается, когда State удаляется из дерева, но может быть повторно вставлена до завершения текущего изменения кадра. Этот метод существует в основном потому, что объекты состояния можно перемещать из одной точки дерева в другую.

  9. dispose(): Dispose вызывается при удалении объекта State, который является постоянным. Этот метод используется для отмены подписки и отмены всех анимаций, потоков и т.д.

  10. mount is false: объект состояния никогда не может быть перемонтирован, и выдается ошибка, вызывается setState.

Ответ 3

Жизненный цикл приложения

Для LifeCycle вам нужно использовать WidgetsBindingObserver, он работает, когда приложение выходит на передний план и фон.

import 'package:flutter/widgets.dart';
  class YourWidgetState extends State<YourWidget> with WidgetsBindingObserver {

       @override
      void initState() {
        WidgetsBinding.instance.addObserver(this);
        super.initState();
      }


      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }


       @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        if (state == AppLifecycleState.resumed) {
           //do your stuff
        }
      }
    }

Но в моем случае я не смог уловить ситуацию OnResume при переходе с одного экрана на другой. поэтому приведенный ниже код работает аналогично startActivityForResult.

используйте этот код при переходе к другому виду деятельности

Navigator.push(context,
              MaterialPageRoute(builder: (context) => ProductDetails(pid: productList[index]["pid"],),
                  settings: RouteSettings(name: '/productdetail')),).then((value){
                    setState(() {
                      length=value;
                    });
                    debugPrint('CHECK BACK FROM DETAIL $length');
            });

при нажатии назад

onPressed: (){Navigator.pop(context,length);}

Ответ 4

Я не думаю, что обратные вызовы жизненного цикла приложения флаттера помогут вам здесь. Вы можете попробовать эту логику.

На 1-й странице (при переходе на 2-ю страницу)

Navigator.push(context, MaterialPageRoute(builder: (context) => Page2())).then((value) {
  print("Value returned form Page 2 = $value");
};

На 2-й странице (при переходе на 1-ю страницу)

Navigator.pop(context, returnedValue);

Жизненный цикл обратного вызова

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

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print("Current state = $state");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Lifecycle")),
        body: Center(child: Text("Center"),),
      ),
    );
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
}

Ответ 5

здесь вы можете узнать, насколько точно вы можете вернуть данные из "Activity -B" обратно в "Activity A"

Ответ 6

enter image description here Конструктор

Эта функция не является частью жизненного цикла, поскольку на этот раз состояние свойства виджета пустое, если вы хотите получить доступ к свойствам виджета в конструкторе, работать не будет. Но конструктор должен быть первым вызовом.

createState

Когда Флаттер получает указание построить StatefulWidget, он немедленно вызывает createState()

Начальное состояние

Вызывается, когда этот объект вставляется в дерево.

При вставке дерева рендеринга при вызове эта функция вызывается только один раз в жизненном цикле. Здесь вы можете выполнить некоторую инициализацию, например переменные состояния инициализации.

SetState

Метод setState() часто вызывается из самой среды Flutter и от разработчика.

didChangeDependencies

Вызывается при изменении зависимости этого объекта [State].

didUpdateWidget

Вызывается при изменении конфигурации виджета.

деактивировать

Вызывается, когда этот объект удаляется из дерева. Перед тем, как утилизировать, мы будем вызывать эту функцию.

распоряжаться

Вызывается, когда этот объект навсегда удален из дерева.

didChangeAppLifecycleState

Вызывается, когда система переводит приложение в фоновый режим или возвращает приложение на передний план.

Вот хороший подробный документ: https://flutterbyexample.com/stateful-widget-lifecycle/

    import 'package:flutter/material.dart';

    class ScreenLifecyle extends StatefulWidget {
    ScreenLifecyleState state;

    //createState(): When the Framework is instructed to build a StatefulWidget, it immediately calls createState()
    @override
    State<StatefulWidget> createState() {
        // TODO: implement createState
        return ScreenLifecyleState();
    }
    }

    class ScreenLifecyleState extends State<ScreenLifecyle> {
    /*
    mounted is true: When createState creates your state class, a buildContext is assigned to that state.
    BuildContext is, overly simplified, the place in the widget tree in which this widget is placed.
    Here a longer explanation. All widgets have a bool this.mounted property.
    It is turned true when the buildContext is assigned. It is an error to call setState when a widget is unmounted.
    mounted is false: The state object can never remount, and an error is thrown is setState is called.
    */

    /*
    This is the first method called when the widget is created (after the class constructor, of course.)
    initState is called once and only once. It must called super.initState().
    */
    @override
    void initState() {
        // TODO: implement initState
        super.initState();
        print("initState");
    }

    /*
    This method is called immediately after initState on the first time the widget is built.
    */
    @override
    void didChangeDependencies() {
        // TODO: implement didChangeDependencies
        super.didChangeDependencies();
        print("didChangeDependencies");
    }

    /*
    build(): This method is called often. It is required, and it must return a Widget.
    */
    @override
    Widget build(BuildContext context) {
        print("build");

        // TODO: implement build
        return Container();
    }

    /*
    If the parent widget changes and has to rebuild this widget (because it needs to give it different data),
    but it being rebuilt with the same runtimeType, then this method is called.
    This is because Flutter is re-using the state, which is long lived.
    In this case, you may want to initialize some data again, as you would in initState.
    */
    @override
    void didUpdateWidget(ScreenLifecyle oldWidget) {
        print("didUpdateWidget");

        // TODO: implement didUpdateWidget
        super.didUpdateWidget(oldWidget);
    }

    @override
    void setState(fn) {
        print("setState");

        // TODO: implement setState
        super.setState(fn);
    }

    /*
    Deactivate is called when State is removed from the tree,
    but it might be reinserted before the current frame change is finished.
    This method exists basically because State objects can be moved from one point in a tree to another.
    */
    @override
    void deactivate() {
        // TODO: implement deactivate
        print("deactivate");
        super.deactivate();
    }

    /*
    Dispose is called when the State object is removed, which is permanent.
    This method is where you should unsubscribe and cancel all animations, streams, etc.
    */
    @override
    void dispose() {
        // TODO: implement dispose
        super.dispose();
     }

       @override
        void didChangeAppLifecycleState(AppLifecycleState state) {
            super.didChangeAppLifecycleState(state);
            switch (state) {
            case AppLifecycleState.inactive:
                print('appLifeCycleState inactive');
                break;
            case AppLifecycleState.resumed:
                print('appLifeCycleState resumed');
                break;
            case AppLifecycleState.paused:
                print('appLifeCycleState paused');
                break;
            case AppLifecycleState.suspending:
                print('appLifeCycleState suspending');
                break;
            }
        }

  }