【发布时间】:2022-11-02 19:50:34
【问题描述】:
我正在开发一个带有 go_router 和 riverpod 的 Flutter 应用程序,分别用于导航和状态管理。该应用程序有一个小部件,它显示实时摄像头供稿,我想“关闭它”并在其他页面堆叠在它上面时释放摄像头。
这是 GoRouter 代码的示例没有这样的逻辑。
GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => CameraWidget(),
routes: [
GoRoute(
path: 'page1',
builder: (context, state) => Page1Screen(),
),
],
),
],
)
我的第一次尝试是在 GoRoute 构建器中添加一些逻辑:
GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) {
if (state.location == "/") {
return CameraWidget();
}
return Center(child: Text("Camera not visible");
},
routes: [
GoRoute(
path: 'page1',
builder: (context, state) => Page1Screen(),
),
],
),
],
)
但这显然不工作因为从“/”到“/page1”时不会再次调用构建器。
然后我想到了使用 Riverpod StateProvider 来保持相机“开/关”状态,由 GoRouter 操作。这是我尝试过的:
GoRouter(
routes: [
GoRoute(
path: '/',
redirect: (context, state) {
final cameraStateNotifier = ref.read(cameraStateNotifierProvider.notifier);
if (state.location == "/") {
cameraStateNotifier.state = true;
} else {
cameraStateNotifier.state = false;
}
return null;
},
builder: (context, state) => CameraWidget(),
routes: [
GoRoute(
path: 'page1',
builder: (context, state) => Page1Screen(),
),
],
),
],
)
但这也不工作显然redirect 在重建小部件树时被调用,并且在这种情况下禁止更改提供者状态。
有没有人遇到过同样的问题?如何让提供商监听 GoRouter 的位置变化?
【问题讨论】:
标签: flutter riverpod flutter-riverpod gorouter routemaster