Приведенное ниже приложение работает должным образом, но, к сожалению, не работает с горячей перезагрузкой. Хотелось бы узнать, как заставить работать с ним горячую перезагрузку.
Все, что делает код, - это просто ждать, пока станет доступен конкретный Future<String>
, а затем отобразить эту строку на экране. Во время ожидания отображается индикатор выполнения.
Как я уже сказал, это работает, как ожидалось, но проблема в том, что если я что-то изменю (я имею в виду просто косметические вещи) и сработает горячая перезагрузка, приложение просто будет постоянно показывать индикатор прогресса, потому что connectionState
остается в режиме ConnectionState.waiting
. .
Вот что делает код более подробно:
Я регистрирую объект String
как синглтон в GetIt
. Поскольку эта строка заключена в Future
, код должен дождаться ее готовности, прежде чем ее можно будет зарегистрировать.
(В реальном коде я загружаю строку JSON из актива. Вот почему она находится в Future
.)
FutureBuilder
ожидает доступности строкового синглтона, ожидая, пока GetIt
сигнализирует о свойстве с именем readyFuture
.
Когда строка становится доступной, FutureBuilder
отображает ее на экране. А пока отображается CircularProgressIndicator
.
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
GetIt locator = GetIt.instance;
void setupLocator() async {
final str = await Future<String>.delayed(Duration(seconds: 3), () => "hello");
locator.registerSingleton(str, signalsReady: true);
locator.signalReady(str);
}
void main() {
setupLocator();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<void>(
future: locator.readyFuture,
builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
Widget result;
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
result = Center(child: CircularProgressIndicator());
break;
case ConnectionState.done:
if (snapshot.hasError)
result = Center(child: Text('Error: ${snapshot.error}'));
else
result = Center(child: Text('${locator.get<String>()}'));
break;
}
return result;
}
),
);
}
}
В моем pubspec.yaml есть следующие зависимости:
get_it: ^3.0.1
provider: ^3.1.0