美文网首页
Flutter Provider5.0状态管理使用入门

Flutter Provider5.0状态管理使用入门

作者: 小源子2016 | 来源:发表于2021-03-23 19:13 被阅读0次

    一.环境配置

    environment:
      sdk: ">=2.12.0 <3.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
      provider: 5.0.0
    

    二.案例

    1.create: (_): 后面要接一个新创建的,而不能是已存在的变量
    2.ProxyProvider被我用来把Counter的值转换为另外一个值
    3.${context.watch<Translations>().title} 是监听转换后的代理值
    4.() => context.read<Counter>().increment() 则是触发数据源指向动作
    5.Provider状态管理类似与React的Mobox,其实我理解都是交给Provider托管的
    // ignore_for_file: public_member_api_docs, lines_longer_than_80_chars
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    /// This is a reimplementation of the default Flutter application using provider + [ChangeNotifier].
    
    void main() {
      runApp(
        /// Providers are above [MyApp] instead of inside it, so that tests
        /// can use [MyApp] while mocking the providers
        MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => Counter()),
            ProxyProvider<Counter, Translations>(
                update:(_,counter,__) => Translations(counter.count)
            )
          ],
          child: const MyApp(),
        ),
      );
    }
    
    class Translations {
      const Translations(this._value);
    
      final int _value;
    
      String get title => 'You clicked $_value times';
    }
    
    /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
    // ignore: prefer_mixin
    class Counter with ChangeNotifier, DiagnosticableTreeMixin {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();
      }
    
      /// Makes `Counter` readable inside the devtools by listing all of its properties
      @override
      void debugFillProperties(DiagnosticPropertiesBuilder properties) {
        super.debugFillProperties(properties);
        properties.add(IntProperty('count', count));
      }
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      const MyHomePage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Example'),
          ),
          body: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              mainAxisAlignment: MainAxisAlignment.center,
              children: const <Widget>[
                Text('You have pushed the button this many times:'),
    
                /// Extracted as a separate widget for performance optimization.
                /// As a separate widget, it will rebuild independently from [MyHomePage].
                ///
                /// This is totally optional (and rarely needed).
                /// Similarly, we could also use [Consumer] or [Selector].
                Count(),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            key: const Key('increment_floatingActionButton'),
    
            /// Calls `context.read` instead of `context.watch` so that it does not rebuild
            /// when [Counter] changes.
            onPressed: () => context.read<Counter>().increment(),
            tooltip: 'Increment',
            child: const Icon(Icons.add),
          ),
        );
      }
    }
    
    class Count extends StatelessWidget {
      const Count({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Text(
    
          /// Calls `context.watch` to make [Count] rebuild when [Counter] changes.
            '${context.watch<Translations>().title}',
            key: const Key('counterState'),
            style: Theme.of(context).textTheme.headline4);
      }
    }
    
    
    image.png

    问题

    1.空安全支持SDK 至少2.12.0(This requires the 'non-nullable' language feature to be enabled.)
    2.Flutter 查看依赖包信息 flutter pub deps
    image.png

    参考:https://github.com/rrousselGit/provider/blob/master/resources/translations/zh-CN/README.md

    pub:https://pub.dev/packages/provider

    相关文章

      网友评论

          本文标题:Flutter Provider5.0状态管理使用入门

          本文链接:https://www.haomeiwen.com/subject/qrtqhltx.html