带有 Riverpod 的 Flutter 导航栏

标签 flutter dart riverpod

我尝试管理我的状态,但我真的做不到。我想学习如何使用riverpod包在管理页面底部创建一个导航栏。

我设法管理我们单击的页面,但我不知道如何根据所选按钮返回正确的寻呼机

Main.dart:

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:app/ui/screens/my_app/my_app_screen.dart';

void main() {
  runApp(
    const ProviderScope(child: MyApp()),
  );
}

NavigationBarScreen.dart:

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

final provider = StateNotifierProvider((ref) => NavigationNotifier());

class NavigationBarScreen extends HookWidget
{
  @override
  Widget build(BuildContext context) {

    return SafeArea(
      child: Scaffold(
        body : Container(
              margin: EdgeInsets.only(left : 8, right : 8, bottom: 8),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.only(
                    topRight: Radius.circular(20), topLeft: Radius.circular(20)),
                boxShadow: [
                  BoxShadow(color: AppColors.colorShadowLight, spreadRadius: 0, blurRadius: 10),
                ],
              ),
              child: ClipRRect(
                borderRadius: BorderRadius.circular(50.0),
                child: BottomNavigationBar(
                  type: BottomNavigationBarType.fixed,
                  backgroundColor: AppColors.colorBgDark,
                  fixedColor: AppColors.colorContrastOrange,
                  unselectedItemColor: AppColors.colorFontLight2,
                  currentIndex: 0,
                  showSelectedLabels: false,
                  showUnselectedLabels: false,
                  onTap: context.read(provider).selectPage,
                  items: [
                    BottomNavigationBarItem(
                      icon: Icon(Icons.home),
                      title: Text('Home'),
                    ),
                    BottomNavigationBarItem(
                      icon: Icon(Icons.settings),
                      title: Text('Settings'),
                    ),
                  ],
                ),
              ),
            ),
      ),
    );
  }
}

NavigationNotifier.dart:

import 'package:hooks_riverpod/hooks_riverpod.dart';

enum NavigationBarEvent { HOME, PROFIL}

class NavigationNotifier extends StateNotifier<PageModel> {
  NavigationNotifier() : super(defaultPage);

  static const defaultPage = PageModel(NavigationBarEvent.HOME);

  void selectPage(int i){
    switch (i) {
      case 0:
        state = PageModel(NavigationBarEvent.HOME);
        break;
      case 1:
        state = PageModel(NavigationBarEvent.PROFIL);
        break;
    }
  }
}

class PageModel {
  const PageModel(this.page);
  final NavigationBarEvent page;
}

最佳答案

看来您已经实现了用户点击底部栏时修改状态的所有逻辑。

剩下的唯一一点就是监听状态(可能在您的 Scaffold 中),并决定显示哪个页面。

一种可能是这样写:

class NavigationBarScreen extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final pageModel = useProvider(provider.state);

    Widget body;
    switch (pageModel.page) {
      case NavigationBarEvent.HOME:
        body = Home();
        break;
      case NavigationBarEvent.PROFIL:
        body: Profile();
        break;
    }

    return Scaffold(
      body: body,
      bottomBar: ...
    );
  }
} 

关于带有 Riverpod 的 Flutter 导航栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64435989/

相关文章:

firebase - 如何显示所有用户的倒数时间

flutter - 如何不删除数组中的最后一个元素(Dart语言)

flutter - 是否可以减少代码的编写以取出例如 : ref. read(countProvider.notifier) - 在构建方法中?

flutter - 如何使用 StateNotifierProvider 中的 StreamProvider?

flutter - RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider

flutter - Flutter:共享首选项单例未正确初始化

firebase - 如何向 FirebaseAnimatedList 添加分页

iOS 应用程序在真实设备上崩溃。错误 : dyld`__abort_with_payload

dart - 如何在 Dart 中使用格式良好的箭头函数?

flutter - 如何检查 InputField 上的文本是否被遮挡