Flutter - сложные функции в initState (), замедляющие навигацию и производительность - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю над этим приложением, где вы можете перейти к экрану с виджетом с сохранением состояния, который имеет множество сложных функций, выполняющихся в initState().

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

Мой код выглядит следующим образом

@override
void initState(){
  someComplexHeavyFunctions();      

  super.initState();
}   

Есть ли способ убедиться, что навигация завершена (быстро и беспорядочно)) перед запуском функции в initState(), а также, возможно, с отображением загрузчика, когда функции еще обрабатываются после перехода к экрану?

, например:

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

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

Это полный пример:

import 'dart:async';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Test"),
      ),
      body: new Center(
        child: FloatingActionButton(
          child: Text("Go"),
          onPressed: () {
            Navigator.of(context)
                .push(MaterialPageRoute(builder: (_) => OtherPage()));
          },
        ),
      ),
    );
  }
}

class OtherPage extends StatefulWidget {
  @override
  _OtherPageState createState() => _OtherPageState();
}

class _OtherPageState extends State<OtherPage> {
  bool initialized = false;

  @override
  void initState() {
    super.initState();

    initialize();

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await showDialog<String>(
        context: context,
        builder: (BuildContext context) => new AlertDialog(
              content: Column(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  CircularProgressIndicator(),
                  SizedBox(height: 40.0,),
                  Text("Performing task"),
                ],
              ),
            ),
      );
    });
  }

  Future<void> initialize() async {
    initialized = await Future.delayed(Duration(seconds: 5), () => true);
    Navigator.of(context).pop();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      body: new Center(
        child: initialized ? Text("Initialized") : Container(),
      ),
    );
  }
}
0 голосов
/ 28 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...