toly_menu 0.0.5 copy "toly_menu: ^0.0.5" to clipboard
toly_menu: ^0.0.5 copied to clipboard

A menu tree widget of toly ui.

TolyMenu

import 'package:flutter/material.dart';
import 'package:toly_menu/src/menu.dart';
import 'package:toly_menu/src/model/menu_state.dart';
import 'package:toly_menu/toly_menu.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: HomePage(),
    );
  }

}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  MenuState state = MenuState(expandMenus: ['/dashboard'], activeMenu: '/dashboard/data_analyse', items: [
                     MenuData(
                      path: '/dashboard',
                      label: '总览面板',
                      children: [
                        MenuData(
                            path: '/dashboard/data_analyse',
                            label: '数据分析',
                            deep: 1),
                        MenuData(
                            path: '/dashboard/work_board',
                            label: '工作台',
                            deep: 1,
                            children: [
                              MenuData(
                                  path:
                                  '/dashboard/work_board/a',
                                  label: '第一工作区',
                                  deep: 2),
                              MenuData(
                                  path:
                                  '/dashboard/work_board/b',
                                  label: '第二工作区',
                                  deep: 2),
                              MenuData(
                                  path:
                                  '/dashboard/work_board/c',
                                  label: '第三工作区',
                                  deep: 2),
                            ]),
                      ]),
    MenuData(
        path: '/knowledge',
        label: '知识库管理',
        children: [
          MenuData(
              path: '/knowledge/a',
              label: '语文',
              deep: 1,
              children: [
                MenuData(
                  path: '/knowledge/a/1',
                  label: '诗词歌赋',
                  deep: 2,
                ),
                MenuData(
                  path: '/knowledge/a/2',
                  label: '人物故事',
                  deep: 2,
                ),
                MenuData(
                  path: '/knowledge/a/3',
                  label: '名著推荐',
                  deep: 2,
                )
              ]
          ),
          MenuData(
              path: '/knowledge/b',
              label: '数学',
              children: [
                MenuData(
                  path: '/knowledge/b/1',
                  label: '人物故事',
                  deep: 2,
                ),
                MenuData(
                  path: '/knowledge/b/2',
                  label: '数学定理',
                  deep: 2,
                ),
                MenuData(
                  path: '/knowledge/b/3',
                  label: '几何知识',
                  deep: 2,
                ),
                MenuData(
                  path: '/knowledge/b/4',
                  label: '代数知识',
                  deep: 2,
                )
              ],
              deep: 1),
          MenuData(
              path: '/knowledge/c',
              label: '英语',
              deep: 1),
        ]),
  ]);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Row(
        children: [
          SizedBox(width: 210,
          child: TolyMenu(state: state, onSelect: _onSelect),
          )
        ],
      ),
    );
  }

  void _onSelect(MenuData menu) {
    if(menu.isLeaf){
      state = state.copyWith(activeMenu: menu.path);
    }else{
      List<String> menus = [];
      String path = menu.path.substring(1);
      List<String> parts = path.split('/');

      if(parts.isNotEmpty){
        String path = '';
        for (String part in parts) {
          path+='/$part';
          menus.add(path);
        }
      }

      if(state.expandMenus.contains(menu.path)){
        menus.remove(menu.path);
      }

      state = state.copyWith(expandMenus: menus);

    }
    setState(() {

    });
  }
}