Flutter状态管理插件minimals_state_manager的使用

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

Flutter状态管理插件 minimals_state_manager 的使用

minimals_state_manager 是一个轻量级的状态管理插件,旨在简化Flutter应用中的状态管理。它基于Flutter的原生功能(如InheritedWidgetChangeNotifierValueNotifier等)来实现状态管理。

主要特性

Providers

  • MinProvider:用于单一状态管理。
  • MinMultiProvider:用于多个状态管理。

示例代码

class YourController1 extends ChangeNotifier {
  ValueNotifier<int> count = 0.minx;

  void increment() {
    count.value++;
    notifyListeners();
  }

  void decrement() {
    count.value--;
    notifyListeners();
  }
}

使用 MinProviderMinMultiProvider

// 使用 MinProvider
MinProvider(
  controller: YourController1(),
  child: YourPage(),
)

// 使用 MinMultiProvider
MinMultiProvider(
  controllers: [YourController1(), YourController2()],
  child: YourPage(),
)

MinService

MinService 用于保持控制器在整个应用生命周期内保持活跃状态。例如,购物车控制器可以在整个应用中保持状态。

MinMultiProvider(
  controllers: [
    DashboardController(),
    MinService.permanentController(CartController()),
  ],
  child: DashPage(),
)

Observable Widget

Observable widget 可以监听 ValueNotifier 的变化并更新UI。

$(controller.count, (count) => Text('Count $count'))

也可以使用 ValueListenableBuilder

ValueListenableBuilder(
  valueListenable: controller.count,
  builder: (context, count, child) => Text('Count $count'),
)

使用步骤

安装插件

pubspec.yaml 文件中添加依赖:

dependencies:
  minimals_state_manager: <latest_version>

然后运行以下命令安装插件:

$ flutter pub add minimals_state_manager

示例代码

以下是一个完整的示例,展示如何使用 minimals_state_manager 插件。

main.dart

import 'package:flutter/material.dart';
import 'package:minimals_state_manager/minimals_state_manager.dart';

void main() {
  runApp(
    MaterialApp(
      home: MinProvider(
        controller: MyController(),
        child: const MyPage(),
      ),
    ),
  );
}

class MyController extends ChangeNotifier {
  final count = 0.minx;
  ValueNotifier<User> user = User().minx;

  void increment() {
    count.value++;
    notifyListeners();
  }

  void decrement() {
    count.value--;
    notifyListeners();
  }

  void refresh() {
    count.value = 0;
    notifyListeners();
  }

  void onChangedName(String str) {
    user.update((val) => val.name = str);
    notifyListeners();
  }

  String? validateName(String? str) {
    return str?.length ?? 0 < 2 ? 'insert valid name' : null;
  }

  void onSaveName(String? newValue) {
    user.update((val) => val.name = newValue ?? '');
    notifyListeners();
  }
}

class User {
  User({this.name});
  String? name;
}

class MyPage extends StatelessWidget {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    final controller = MinProvider.use<MyController>(context);

    return Scaffold(
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            backgroundColor: Colors.lightGreen,
            onPressed: () => controller.increment(),
            child: const Icon(Icons.add),
          ),
          const SizedBox(height: 16.0),
          FloatingActionButton(
            backgroundColor: Colors.redAccent,
            onPressed: () => controller.decrement(),
            child: const Icon(Icons.remove),
          ),
          const SizedBox(height: 16.0),
          FloatingActionButton(
            onPressed: () => controller.refresh(),
            child: const Icon(Icons.refresh),
          ),
        ],
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text('Check out the full example in the example folder'),
            Container(
              margin: const EdgeInsets.only(left: 32.0, right: 32.0, bottom: 32.0),
              child: Form(
                key: formKey,
                child: Column(
                  children: [
                    $(controller.user, (user) => Text(user.name ?? '')),
                    TextFormField(
                      onChanged: (value) => controller.onChangedName(value),
                      validator: (value) => controller.validateName(value),
                      onSaved: (newValue) => controller.onSaveName(newValue),
                    ),
                  ],
                ),
              ),
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    $(controller.count, (count) => Text('Count $count')),
                  ],
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter状态管理插件minimals_state_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态管理插件minimals_state_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 minimals_state_manager 进行状态管理的 Flutter 代码示例。minimals_state_manager 是一个轻量级的状态管理库,适用于 Flutter 应用程序。

首先,确保你已经在 pubspec.yaml 文件中添加了 minimals_state_manager 依赖:

dependencies:
  flutter:
    sdk: flutter
  minimals_state_manager: ^latest_version  # 替换为最新版本号

然后,你可以按照以下步骤使用 minimals_state_manager 进行状态管理:

  1. 创建状态类

    首先,定义一个状态类来存储和管理你的应用状态。这个类需要继承自 BaseModel

    import 'package:minimals_state_manager/minimals_state_manager.dart';
    
    class CounterState extends BaseModel {
      int count = 0;
    
      void increment() {
        count++;
        notifyListeners();  // 通知监听者状态已更改
      }
    }
    
  2. 创建提供器(Provider)

    使用 StateProvider 包装你的状态类,并将其提供给 Flutter 组件树。

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    import 'counter_state.dart';  // 导入你定义的状态类
    
    void main() {
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => CounterState()),
          ],
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
  3. 在组件中使用状态

    使用 Consumerselect 函数来访问和监听状态的变化。

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Flutter Demo Home Page'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Consumer<CounterState>(builder: (context, state, child) {
                  return Text(
                    '${state.count}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                }),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Provider.of<CounterState>(context, listen: false).increment();
            },
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

在这个示例中,我们定义了一个 CounterState 类来管理一个计数器。我们使用 ChangeNotifierProvider 来创建并提供这个状态对象。然后,在 MyHomePage 组件中,我们使用 Consumer 来访问和监听 CounterState 的变化,并在按钮点击时更新状态。

这是一个基本的示例,展示了如何在 Flutter 中使用 minimals_state_manager 进行状态管理。你可以根据需要扩展和自定义这个示例。

回到顶部