Mam więc ekran, który pokazuje tekst i obraz powyżej tekstu i ładunków, w tle, niektóre dane ze wspólnych preferencji.

Ale obraz trwa na zawsze załadować, a kiedy wyjmuję połączenie, aby otrzymywać dane wspólne preferencje, które ładuje się bardzo quiclky. Czy ktoś wie, czy robię coś nie tak z tym połączeniem?

Oto kod:

class WelcomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    precacheImage(AssetImage(Images.tomato), context);
    _loadData(context);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              Strings.appName,
              style: TextStyle(
                color: AppColors.black,
                fontSize: 50.0,
                fontWeight: FontWeight.w600,
              ),
            ),
            Image.asset(Images.tomato),
          ],
        ),
      ),
    );
  }

  void _loadData(BuildContext context) async {
    final PreferencesRepository repository = PreferenceRepositoryImp();
    repository.loadAll().then(
      (_) {
        sleep(Duration(seconds: 2));
        Navigator.pushNamedAndRemoveUntil(context, Routes.HOME, (_) => false);
      },
    );
  }
}

I to jest obraz

"tomato"

2
José Fernando Garcia Junior 25 grudzień 2019, 19:16

1 odpowiedź

Najlepsza odpowiedź

Używasz sleep(Duration(seconds: 2));, który wstrzymuje wszystko . Nie należy używać sleep, zwłaszcza wewnątrz metody build. DART JEST Single Gwintowany tak, że oznacza to, że zatrzymuje wątek, zapobiega zbudowanemu UI.

Również dlaczego jest _loadData oznaczony jako async, jeśli nie używasz słowa kluczowego await? Potrzebujesz tylko, jeśli będziesz używać słowa kluczowego await, w przeciwnym razie usuń go. Jeśli chcesz go użyć, powinieneś użyć await Future.delayed(Duration(seconds: 2)), co sprawia, że czeka. Tutaj:

void _loadData(BuildContext context) async {
  final PreferencesRepository repository = PreferenceRepositoryImp();
  await repository.loadAll();
  await Future.delayed(Duration(seconds: 2));
  Navigator.pushNamedAndRemoveUntil(context, Routes.HOME, (_) => false);
}

Jak różni się await od sleep?

await sprawia, że strzałka mówi "Hej, zamierzam zachować moje oko na to w przyszłości" (Haha to dostać? Przyszłość? Hahahhahaha Jestem zabawna). W każdym razie nie będzie kontynuować funkcji _loadData, ponieważ chce tego wartości, ale będzie działać (w swoim przykładzie) metoda kompilacji, a następnie, gdy Future wraca z wartością, będzie Jak "Hej! Jest ta wartość, której szukałem! Teraz mogę prowadzić tę funkcję!"

sleep Z drugiej strony sprawia, że Dart mówi "zamierzam zdrzemnąć czas trwania czasu, który dostanę" (w tym przypadku dwie sekundy). Nic nie zrobi, aż "budzi się", ponieważ Dart jest pojedynczy gwintowany. Po tym, jak zajmie jej dwie drugą drzemkę, będzie kontynuować funkcję, a po zakończeniu, metoda kompilacji będzie kontynuowana, w związku z tym ładując obraz, który wyjaśnia, dlaczego zajmuje to tak długo.

2
Benjamin 25 grudzień 2019, 16:35