Flutter 状态管理Provider(理解成全局变量)

2022-04-28  本文已影响0人  禄子_c79b

前言.相当于全局变量,只要一改数据,引用到的地方就会自动刷新UI改变其值

1.引入 provider: ^6.0.2
2.写model类 UserProvider

import 'package:flutter/cupertino.dart';

class UserProvider extends ChangeNotifier {
  String _name;
  String _gender;

  UserProvider(this._name, this._gender);

  set setName(String value) {
    _name = value;
    notifyListeners();
  }

  String get gender => _gender;

  String get name => _name;

  // Provider.of<UserProvider>(context,listen: false).setGender="famale";
  set setGender(String value) {
    _gender = value;
    notifyListeners();
  }

  // Provider.of<UserProvider>(context,listen: false).setName2("famale");
  void setName2(String value) {
    _name = value;
    notifyListeners();
    print('setName2 call');
  }
}

3.类似注册:
(1)单个对象

class routeIntent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      routes: <String, WidgetBuilder>{//所有的入口
        // "login": (context) => FromPage(),
        "login": (context) => MyApp1(),
      },
      // home: MyHomePage(title: "routeIntent"),
    );
  }
}

void main() {
  runApp(ChangeNotifierProvider<UserProvider>.value(
    child: routeIntent(),
    value: UserProvider('yuren', 'fame'),
  ));
}

(2)多个对象MultiProvider

  runApp(
      MultiProvider(
      providers: [
      //以下两种创建都可以,如果是同一个model类,则使用最近的,即使用 User('yagao','lala')
        //ChangeNotifierProvider(create: (_)=>UserProvider('SSG', '男')),
        ChangeNotifierProvider<UserProvider>.value(value: UserProvider('T1','男男')),
        ChangeNotifierProvider<UserProvider>.value(value: User('yagao','lala')),
        ChangeNotifierProvider(create: (_)=>Order(1,'alibaba'))
      ],
      child: MaterialApp(
        home: MyApp(),
      )
  )
  );

4.调用

Text("name:${Provider.of<UserProvider>(context).name}}")

5.修改,结果就是所有引用的地方都刷新了
注意:这里的listen: false一定要带上,以前的不要,现在新的要,不然报错

        floatingActionButton: FloatingActionButton(
          onPressed: () {
            Provider.of<UserProvider>(context,listen: false).setName2("gunsitan");
          },
          child: Icon(Icons.add),
        ),
上一篇下一篇

猜你喜欢

热点阅读