Flutter导航布局插件nav_layouts_component的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter导航布局插件nav_layouts_component的使用

布局结构

该插件提供了多种内置导航能力的布局组件。以下是这些布局组件的类图,展示了它们是如何堆叠来创建不同的布局和导航体验。

Splash Layout(启动布局)
classDiagram
  class RootLayout
  class RootState
  class RootSplashLayout
  class RootSplashState
  class Scaffold
  class NotificationScope

  RootLayout --> RootState
  RootState <|-- RootSplashState

  RootSplashLayout --> RootLayout
  RootLayout --> Scaffold
  RootSplashLayout --> RootSplashState
  Scaffold --> NotificationScope
Navigation Layout(导航布局)
classDiagram
  class RootLayout
  class RootState
  class RootNavLayout
  class NavLayout
  class Scaffold
  class NotificationScope

  RootLayout --> RootState

  RootNavLayout --> RootLayout
  RootLayout --> NavLayout
  NavLayout --> NotificationScope
  NotificationScope --> Scaffold

完整示例Demo

以下是一个完整的示例代码,演示如何在Flutter应用中使用nav_layouts_component插件。

import 'dart:io';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:window_manager/window_manager.dart';
import 'package:logging/logging.dart';

import 'package:utilities_ab/logging/init_logging.dart';
import 'package:platform_utilities_component/platform_utilities.dart';

import 'package:app_framework_component/app_framework.dart' as app;
import 'package:nav_layouts_component/nav_layouts.dart' as nav;

import 'config/app_config.dart';
import 'features/test_feature.dart';
import 'features/devices_feature.dart';
import 'features/workflow_feature.dart';
import 'screens/home_page.dart';
import 'screens/nav_home_view_1.dart';
import 'screens/nav_home_view_2.dart';
import 'screens/nav_home_view_3.dart';

void main() async {
  initLogging(
    Level.ALL,
    logToConsole: true,
  );

  // 在桌面平台上,窗口的最小尺寸固定为240x400
  if (!AppPlatform.isWeb && !AppPlatform.isMobile) {
    WidgetsFlutterBinding.ensureInitialized();
    await windowManager.ensureInitialized();

    WindowManager.instance.setMinimumSize(AppConfig.minWindowSize);
    WindowManager.instance.setTitle(AppConfig.title);
  }

  // 创建并初始化特征注册表单例
  app.FeatureRegistry.intialize(featureConfigLoader);

  await TestFeature.register();
  await DevicesFeature.register();
  await WorkflowFeature.register();

  AppPlatform.init().then(
    (_) => runApp(
      nav.StatefulWrapper(
        child: MainApp(),
      ),
    ),
  );
}

class MainApp extends StatelessWidget {
  late final GoRouter _router;

  MainApp({super.key}) {
    _router = GoRouter(
      navigatorKey: nav.GlobalNavigator.key,
      initialLocation: '/',
      routes: [
        const HomePage().route(),
        NavHomeView1().route(),
        NavHomeView2().route(),
        const NavHomeView3().route(),
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    AppPlatform.initOnBuild(context);

    if (AppPlatform.isDesktop && Platform.isMacOS) {
      // 在macOS上,系统菜单是每个应用程序的一部分
      final List<PlatformMenuItem> menus = <PlatformMenuItem>[
        PlatformMenu(
          label: '', // 在macOS上,应用程序名称显示在菜单栏上
          menus: <PlatformMenuItem>[
            PlatformMenuItemGroup(
              members: <PlatformMenuItem>[
                PlatformMenuItem(
                  label: '关于',
                  onSelected: () {
                    showAboutDialog(
                      context: context,
                      applicationName: AppConfig.title,
                      applicationVersion: AppConfig.version,
                    );
                  },
                ),
              ],
            ),
            if (PlatformProvidedMenuItem.hasMenu(
                PlatformProvidedMenuItemType.quit))
              const PlatformProvidedMenuItem(
                  type: PlatformProvidedMenuItemType.quit),
          ],
        ),
      ];
      WidgetsBinding.instance.platformMenuDelegate.setMenus(menus);
    }

    return app.FeatureRegistry.instance().scope(
      context,
      child: MaterialApp.router(
        debugShowCheckedModeBanner: false,
        title: AppConfig.title,
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(
            seedColor: Colors.indigo,
          ),
          useMaterial3: false,
        ),
        darkTheme: ThemeData(
          colorScheme: ColorScheme.fromSeed(
            brightness: Brightness.dark,
            seedColor: Colors.indigo,
          ),
          useMaterial3: false,
        ),
        routerConfig: _router,
      ),
    );
  }
}

Future<Map<String, dynamic>> featureConfigLoader(
  String featureName,
) async {
  /// 从资产加载特征配置json
  return jsonDecode(
    await rootBundle.loadString('assets/${featureName}_feature.json'),
  );
}

更多关于Flutter导航布局插件nav_layouts_component的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter导航布局插件nav_layouts_component的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,nav_layouts_component 并不是一个官方或广泛认可的插件名称。不过,基于你的需求,我们可以假设你想了解如何使用一个自定义的导航布局组件,或者创建一个类似的组件来管理Flutter应用中的导航和布局。

以下是一个简单的示例,展示了如何创建一个自定义的导航布局组件,并在Flutter应用中使用它。这个示例不会直接涉及nav_layouts_component,但会提供一个类似功能的实现。

1. 创建一个自定义导航布局组件

首先,我们创建一个自定义的导航布局组件,它包含一个底部的导航栏和页面内容的区域。

import 'package:flutter/material.dart';

class CustomNavLayout extends StatefulWidget {
  @override
  _CustomNavLayoutState createState() => _CustomNavLayoutState();
}

class _CustomNavLayoutState extends State<CustomNavLayout> {
  int _selectedIndex = 0;

  final List<Widget> _pages = [
    HomePage(),
    SearchPage(),
    ProfilePage(),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Nav Layout'),
      ),
      body: Center(
        child: _pages[_selectedIndex],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            label: 'Search',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person),
            label: 'Profile',
          ),
        ],
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Home Page'));
  }
}

class SearchPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Search Page'));
  }
}

class ProfilePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Profile Page'));
  }
}

2. 在主应用中使用自定义导航布局组件

接下来,我们在主应用中引入并使用这个自定义的导航布局组件。

import 'package:flutter/material.dart';
import 'custom_nav_layout.dart'; // 假设上面的代码保存在这个文件里

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CustomNavLayout(),
    );
  }
}

总结

上面的代码展示了如何创建一个自定义的导航布局组件,并在Flutter应用中使用它。这个组件包含一个底部的导航栏和几个页面,用户可以通过点击导航栏的图标来切换页面。

如果你确实在寻找一个名为nav_layouts_component的特定插件,你可能需要查阅该插件的官方文档或搜索相关的社区资源来获取更详细的使用指南和代码示例。如果这是一个假设的插件名称,上面的代码提供了一个通用的导航布局实现,你可以根据自己的需求进行调整和扩展。

回到顶部