Flutter状态管理插件stacked_hooks的使用

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

Flutter状态管理插件stacked_hooks的使用

Stacked Hooks简介

Stacked Hooks 是一个包含小部件的软件包,允许您在 Stacked 架构中使用Flutter Hooks包。通过将Flutter Hooks与Stacked架构中的StackedView结合使用,您可以更方便地管理和操作状态。

StackedHookView

StackedView 是一个返回由Provider提供的值作为参数的小部件类实现,这使得ViewModel的消费和使用更加容易,而无需样板代码。StackedHookView允许您在这个小部件内部使用Flutter Hooks,特别适用于需要使用TextEditing控制器的情况。

// View that creates and provides the viewmodel
class StackedHookViewExample extends StackedView<HomeViewModel> {
  const StackedHookViewExample({Key key}) : super(key: key);

  @override
  Widget builder(BuildContext context, HomeViewModel model, Widget? child) {
    return Scaffold(
      body: Center(child: _HookForm()),
    );
  }

  @override
  HomeViewModel modelBuilder(BuildContext context) {
    return HomeViewModel();
  }
}

// Form that makes use of the ViewModel provided above but also makes use of hooks
class _HookForm extends StackedHookView<HomeViewModel> {
  @override
  Widget buildStackedView(BuildContext context, HomeViewModel model) {
    final title = useTextEditingController();
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Text(model.title),
        TextField(controller: title, onChanged: model.updateTitle),
      ],
    );
  }
}

// ViewModel
class HomeViewModel extends BaseViewModel {
  String title = 'default';

  void updateTitle(String value) {
    title = value;
    notifyListeners();
  }
}

完整示例Demo

为了更好地理解如何在实际项目中使用Stacked Hooks,以下是一个完整的示例demo,该示例展示了如何创建一个简单的应用程序,并使用Stacked Hooks进行状态管理。

示例代码

主文件(main.dart)

首先,我们需要设置应用程序的基本结构,包括初始化依赖注入、设置对话框UI和底部表单UI等。

import 'package:flutter/material.dart';
import 'package:stacked_hooks_example/ui/common/app_colors.dart';
import 'package:stacked_hooks_example/ui/setup/setup_bottom_sheet_ui.dart';
import 'package:stacked_hooks_example/ui/setup/setup_dialog_ui.dart';
import 'package:stacked_services/stacked_services.dart';

import 'app/app.locator.dart';
import 'app/app.router.dart';

void main() {
  setupLocator();
  setupDialogUi();
  setupBottomSheetUi();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: Theme.of(context).copyWith(
        primaryColor: kcBackgroundColor,
        focusColor: kcPrimaryColor,
        textTheme: Theme.of(context).textTheme.apply(
              bodyColor: Colors.black,
            ),
      ),
      initialRoute: Routes.startupView,
      onGenerateRoute: StackedRouter().onGenerateRoute,
      navigatorKey: StackedService.navigatorKey,
    );
  }
}

视图模型(HomeViewModel)

接下来,我们定义一个视图模型来管理应用程序的状态。

class HomeViewModel extends BaseViewModel {
  String title = 'default';

  void updateTitle(String value) {
    title = value;
    notifyListeners();
  }
}

视图(StackedHookViewExample)

然后,我们创建一个视图来显示内容并提供视图模型。

class StackedHookViewExample extends StackedView<HomeViewModel> {
  const StackedHookViewExample({Key key}) : super(key: key);

  @override
  Widget builder(BuildContext context, HomeViewModel model, Widget? child) {
    return Scaffold(
      appBar: AppBar(title: Text('Stacked Hooks Example')),
      body: Center(child: _HookForm()),
    );
  }

  @override
  HomeViewModel modelBuilder(BuildContext context) {
    return HomeViewModel();
  }
}

表单(_HookForm)

最后,我们创建一个表单组件,它将使用Hooks来管理文本编辑控制器,并与视图模型交互以更新状态。

class _HookForm extends StackedHookView<HomeViewModel> {
  @override
  Widget buildStackedView(BuildContext context, HomeViewModel model) {
    final titleController = useTextEditingController();
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Text(model.title),
        TextField(
          controller: titleController,
          onChanged: model.updateTitle,
          decoration: InputDecoration(labelText: 'Enter Title'),
        ),
      ],
    );
  }
}

总结

通过以上步骤,我们已经创建了一个完整的示例应用程序,展示了如何使用Stacked Hooks进行状态管理。Stacked Hooks使您能够在Stacked架构中充分利用Flutter Hooks的强大功能,从而简化状态管理和UI构建过程。希望这个示例能够帮助您更好地理解和应用Stacked Hooks


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用stacked_hooks进行状态管理的示例代码。stacked_hooks是一个基于Flutter HooksStacked架构的状态管理库,它结合了React Hooks的简洁性和Stacked架构的清晰性。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_hooks: ^0.18.0 # 确保版本是最新的
  stacked: ^2.2.3 # 确保版本是最新的
  stacked_hooks: ^0.4.0 # 确保版本是最新的

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

  1. 创建一个ViewModel

    使用ViewModel来管理业务逻辑和状态。

    import 'package:stacked/stacked.dart';
    
    class CounterViewModel extends ViewModel {
      int _count = 0;
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners(); // 通知监听器状态已更改
      }
    }
    
  2. 创建一个Hook

    使用useViewModel这个Hook来在你的Widget中访问ViewModel。

    import 'package:flutter/material.dart';
    import 'package:flutter_hooks/flutter_hooks.dart';
    import 'package:stacked_hooks/stacked_hooks.dart';
    import 'counter_view_model.dart'; // 引入你创建的ViewModel
    
    class CounterScreen extends HookWidget {
      @override
      Widget build(BuildContext context) {
        final CounterViewModel viewModel = useViewModel<CounterViewModel>();
    
        return Scaffold(
          appBar: AppBar(
            title: Text('Counter with Stacked Hooks'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${viewModel.count}',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () => viewModel.increment(),
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    
  3. 在你的应用中使用HookWidget

    确保你的应用或路由系统能够渲染这个HookWidget

    import 'package:flutter/material.dart';
    import 'counter_screen.dart'; // 引入你创建的HookWidget
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: CounterScreen(), // 使用HookWidget
        );
      }
    }
    

以上代码展示了如何使用stacked_hooks来管理一个简单计数器的状态。在这个例子中,CounterViewModel负责状态逻辑,CounterScreen是一个使用useViewModel Hook的Widget,它可以直接访问并监听CounterViewModel的状态变化。

这样,你就可以在Flutter项目中利用stacked_hooks来进行高效的状态管理了。

回到顶部