Приложение ниже работает, как и ожидалось, но, к сожалению, оно не работает с горячей перезагрузкой. Я хотел бы знать, как получить горячую перезагрузку, работая с ним.
Все, что делает код, - это просто ждет, пока конкретный Future<String>
станет доступным, и затем отобразит эту строку на экране. Пока он ждет, отображается индикатор прогресса.
Как я уже сказал, это работает, как и ожидалось, но проблема в том, что, если я что-то изменяю (я имею в виду просто косметические вещи) и запускается горячая перезагрузка, приложениебудет просто сидеть там вечно, показывая индикатор прогресса, потому что connectionState
остается в режиме ConnectionState.waiting
.
Вот что код делает более подробно:
Я регистрирую объект String
как синглтон в GetIt
. Поскольку эта строка заключена в Future
, код должен дождаться ее готовности, прежде чем ее можно будет зарегистрировать.
(В реальном коде я загружаю строку JSON из ресурса. почему он находится в Future
.)
A 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