我有两个页面: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"],
);
},
);
},
),
),
),
);
}
}
家庭控制器:
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),
),
),
),
],
),
);
}
}
详细信息控制器:
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());
这不是我想要的,因为我不想手动跟踪之前的内容。我发现这会导致如果有一个后退按钮(几乎每个页面都有)。
我在这里做错了什么?