flutter中provider的简单使用

本文介绍了一个简单的Flutter应用中使用Provider进行状态管理的方法。通过创建ChangeNotifier的子类,可以实现数据的监听和更新,使多个组件能响应同一数据源的变化。文章提供了完整的代码示例,展示了如何在不同组件间共享和更新数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为刚入坑的小白,provider我也还没完全理解,只是将自己写的demo分享出来,即是希望帮助和我一样的小白,也是为了便于日后自己复习查看

首先创建一个类,关联ChangeNotifier

之后就是在需要监听的页面绑定上面声明的类,这样就可以即时获取到变量,改变相关容

下面就是我demo的所有代码,可直接复制到dart文件里面掺看,由于是直接把代码粘上来的,所以排版就没处理,这里看的话会有些错乱

//声明需要监听的数据,

class CountState with ChangeNotifier{

int _count = 0;

get count => _count;

void increment(){

_count++;

notifyListeners();

}

}

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(

theme: ThemeData(

primaryColor: Colors.orangeAccent,

),

home: HomePage(),

);

}

}

class HomePage extends StatelessWidget {

const HomePage({

Key key,

}):super(key:key);

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(title: Text("Provider测试")),

body: Center(

child: Wrap(

spacing: 10,

runSpacing: 10,

children: <Widget>[

RedBox(),

YellowBox(),

BlueBox(),

GreenBox()

],

),

),

floatingActionButton:

//用Consumer将provider 的相关内容关联起来,这里是点击的时候,就会发出通知,与CountState相关的数据就会变化

Consumer<CountState>(builder: (ctx,state,child)=>FloatingActionButton(

onPressed: (){

state.increment();//使用其内的state执行方法

},

child: Icon(Icons.add),

),

),

);

}

}

class RedBox extends StatelessWidget{

@override

Widget build(BuildContext context) {

return Container(

color: Colors.red,

width: 150,

height: 150,

alignment: Alignment.center,

child: Consumer<CountState>(builder: (ctx,state,child)=>Text("Red:${state.count}",

style: TextStyle(fontSize: 20),

),

),

);

}

}

class YellowBox extends StatelessWidget {

@override

Widget build(BuildContext context) {

print("---------YellowBox---------build---------");

return Container(

color: Colors.yellow,

width: 150,

height: 150,

alignment: Alignment.center,

child: Consumer<CountState>(builder: (ctx,state,child)=>Text("Yellow:${state.count}",

style: TextStyle(fontSize: 20)),)

);

}

}

class BlueBox extends StatelessWidget {

@override

Widget build(BuildContext context) {

return Container(

color: Colors.blueAccent,

width: 150,

height: 150,

alignment: Alignment.center,

child: InkWell(

onTap: (){

Navigator.of(context).push(MaterialPageRoute(builder: (context)=>NextPage()));

},

child: Consumer<CountState>(builder: (ctx,state,child)=>Text("blue${state.count}",style: TextStyle(

fontSize: 18,color: Colors.black

),)

),

),

);

}

}

class GreenBox extends StatelessWidget {

@override

Widget build(BuildContext context) {

print("---------GreenBox---------build---------");

return Container(

color: Colors.green,

width: 150,

height: 150,

alignment: Alignment.center,

child: Consumer<CountState>(builder: (ctx,state,child)=>Text("GreenBox:${state.count}",

style: TextStyle(fontSize: 20))),

);

}

}


 

class NextPage extends StatelessWidget {

@override

Widget build(BuildContext context) {

print("---------NextPage---------build---------");

return Scaffold(

appBar: AppBar(title: Text('Next')),

body: Center(

child: Consumer<CountState>(builder: (ctx,state,child)=> InkWell(

onTap: (){

state.increment();

},

child: Container(

color: Colors.purple,

width: 150,

height: 150,

alignment: Alignment.center,

child: Consumer<CountState>(builder:(ctx,state,child)=>Text("NextPage:${state.count}",

style: TextStyle(fontSize: 20))

),

),

),

)

),

);

}

}

# 2024-3-5  provider 6.1.2版本

1、先在根试图理注册

声明provider

触发provider

获取provider的值,有下面三种方法可获取

Flutter中的Provider是一个状态管理工具,它可以帮助我们在应用程序中共享数据。 使用Provider的步骤如下: 1. 引入Provider包 在项目的pubspec.yaml文件中加入provider包的依赖: ``` dependencies: flutter: sdk: flutter provider: ^4.3.2+2 ``` 2. 创建数据模型 在使用Provider之前,需要先定义一个数据模型。这个数据模型可以是一个类,也可以是一个数据结构。 例如,我们可以定义一个名为“CountModel”的数据模型,用于存储计数器的: ``` class CountModel extends ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } } ``` 在这个模型中,我们定义了一个私有变量_count,用于存储计数器的。我们还定义了一个公共的getter方法count,用于获计数器的。最后,我们定义了一个increment方法,用于将计数器的加1,并通过notifyListeners通知依赖该模型的组件进行更新。 3. 在组件中使用Provider 在组件中使用Provider非常简单。我们可以使用Provider.of方法来获数据模型,并在组件中使用该数据模型。 例如,我们可以创建一个名为“CounterPage”的页面,用于显示计数器的和一个按钮,用于增加计数器的: ``` class CounterPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Counter'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Counter', ), Consumer<CountModel>( builder: (context, countModel, child) { return Text( '${countModel.count}', style: Theme.of(context).textTheme.headline4, ); }, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { Provider.of<CountModel>(context, listen: false).increment(); }, tooltip: 'Increment', child: Icon(Icons.add), ), ); } } ``` 在这个页面中,我们使用Consumer来获CountModel数据模型,并在Text组件中显示计数器的。我们还使用Provider.of方法来获CountModel数据模型,并在FloatingActionButton组件中使用increment方法来增加计数器的。 这就是使用Provider的基本步骤。需要注意的是,Provider.of方法会向上查找widget树,直到找到对应的Provider对象。因此,我们需要在应用程序的根组件中创建Provider对象,以便在整个应用程序中共享数据模型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值