У меня две страницы: HomePage и DetailsPage и связанные с ними GetxControllers.
Домашняя страница:
class HomePage extends GetView<HomeController> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('HomePage')),
body: Container(
child: Obx(
() => ListView.builder(
itemCount: controller.task.length,
itemBuilder: (context, index) {
return ListTile(
leading: Text('${index + 1}'),
title: Text(controller.task[index]["name"]),
onTap: () {
Get.to(
DetailsPage(),
arguments: controller.task[index]["name"],
);
},
);
},
),
),
),
);
}
}
HomeController:
class HomeController extends GetxController {
final TaskRepository repository;
HomeController({@required this.repository}) : assert(repository != null);
final _task = [].obs;
set task(value) => this._task.assignAll(value);
get task => this._task;
onInit() {
super.onInit();
getAllTask();
}
getAllTask() {
repository.getAll().then((value) => task = value);
}
}
Как видите, HomeController зависит от TaskRepository, который является фиктивным репозиторием.
И моя DetailsPage:
class DetailsPage extends GetView<DetailsController> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
GestureDetector(
onTap: () {
Get.back();
},
child: Row(
children: [
Icon(Icons.arrow_back),
Text('Go Back'),
],
),
),
Expanded(
child: Center(
child: Obx(
() => Text(controller.taskDetail.value),
),
),
),
],
),
);
}
}
DetailsController:
class DetailsController extends GetxController {
final taskDetail = ''.obs;
@override
void onInit() {
super.onInit();
taskDetail.value = Get.arguments;
}
}
Я создал класс AppDependencies для инициализации зависимостей (контроллеры, репозитории, клиенты API и т. Д.):
class AppDependencies {
static Future<void> init() async {
Get.lazyPut(() => HomeController(repository: Get.find()));
Get.lazyPut(() => DetailsController());
Get.lazyPut(() => TaskRepository(apiClient: Get.find()));
Get.lazyPut(() => TaskClient());
}
}
Я инициализирую все зависимости, вызывая AppDependencies.init()
на main()
:
void main() async {
await AppDependencies.init();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
Подробная страница в первый раз
Вернуться на главную страницу, а затем снова перейти на страницу сведений
Как видно на третьем изображении, при возврате с DetailsPage к HomePage и возврата к DetailsPage возникает исключение, в котором говорится:
"DetailsController" not found. You need to call "Get.put(DetailsController())" or "Get.lazyPut(()=>DetailsController())"
Но я уже делал это на main()
. Я также пробовал использовать Get.put()
вместо Get.lazyPut()
, но обнаружил, что для Get.put()
любые зависимости любой другой зависимости должны быть зарегистрированы перед зависимой. Например, HomeController зависит от TaskRepository, поэтому TaskRepository должен быть перед HomeController, если используется Get.put()
, например:
Get.put(TaskRepository());
Get.put(HomeController());
И это не то, что я хочу, потому что я не хочу отслеживать то, что происходит раньше, вручную. И я обнаружил, что это вызывает наличие кнопки «Назад» (которая есть почти на каждой странице).
Что я здесь делаю не так?