[英]Flutter default counter app using BLoC pattern
I'm new to Flutter and I'm trying to use BLoC for state management.我是 Flutter 的新手,我正在尝试使用 BLoC 进行状态管理。 So I'm trying to rewrite flutter's default counter app using BLoC.
所以我正在尝试使用 BLoC 重写 Flutter 的默认计数器应用程序。 Unfortunately my UI is not redrawn when the add button is pressed.
不幸的是,当按下添加按钮时,我的 UI 没有重绘。 I don't know what I'm doing wrong I'm using
我不知道我做错了什么我正在使用
bloc: ^6.1.0
equatable: ^1.2.5
flutter_bloc: ^6.0.6
Here is my code这是我的代码
counter_event.dart counter_event.dart
part of 'counter_bloc.dart';
abstract class CounterEvent extends Equatable {
const CounterEvent();
@override
List<Object> get props => [];
}
class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}
counter_state.dart counter_state.dart
part of 'counter_bloc.dart';
class CounterState extends Equatable {
final int counter;
const CounterState({@required this.counter});
@override
List<Object> get props => [counter];
}
counter_bloc.dart counter_bloc.dart
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';
part 'counter_event.dart';
part 'counter_state.dart';
class CounterBloc extends Bloc<CounterEvent, CounterState> {
CounterBloc() : super(CounterState(counter: 0));
@override
Stream<CounterState> mapEventToState(CounterEvent event) async* {
if (state is IncrementEvent) {
yield CounterState(counter: state.counter + 1);
} else if (state is DecrementEvent) {
yield CounterState(counter: state.counter - 1);
}
}
}
Here is the main function这是主要功能
main.dart main.dart
import 'package:counter_bloc/bloc/counter_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(title: 'Flutter Demo Home Page'),
);
}
}
class Home extends StatefulWidget {
Home({Key key, this.title}) : super(key: key);
final String title;
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
CounterBloc counterBloc = CounterBloc();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: BlocBuilder<CounterBloc, CounterState>(
cubit: counterBloc,
builder: (context, state) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
state.counter.toString(),
style: Theme.of(context).textTheme.headline4,
),
],
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counterBloc.add(IncrementEvent());
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
@override
void dispose() {
counterBloc.close();
super.dispose();
}
}
You can copy paste run full code below您可以在下面复制粘贴运行完整代码
Step 1: if (event is IncrementEvent)
not state
第 1 步:
if (event is IncrementEvent)
没有state
Step 2: You need BlocProvider
第 2 步:您需要
BlocProvider
home: BlocProvider<CounterBloc>(
create: (context) => CounterBloc(),
child: Home(
title: "test",
),
),
Step 3: You need to call BlocProvider.of<CounterBloc>
第 3 步:您需要调用
BlocProvider.of<CounterBloc>
Widget build(BuildContext context) {
final CounterBloc counterBloc = BlocProvider.of<CounterBloc>(context);
working demo工作演示
full code完整代码
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
abstract class CounterEvent extends Equatable {
const CounterEvent();
@override
List<Object> get props => [];
}
class IncrementEvent extends CounterEvent {}
class DecrementEvent extends CounterEvent {}
class CounterState extends Equatable {
final int counter;
const CounterState({@required this.counter});
@override
List<Object> get props => [counter];
}
class CounterBloc extends Bloc<CounterEvent, CounterState> {
CounterBloc() : super(CounterState(counter: 0));
@override
Stream<CounterState> mapEventToState(CounterEvent event) async* {
print(event.toString());
if (event is IncrementEvent) {
print("inc");
yield CounterState(counter: state.counter + 1);
} else if (state is DecrementEvent) {
yield CounterState(counter: state.counter - 1);
}
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: BlocProvider<CounterBloc>(
create: (context) => CounterBloc(),
child: Home(
title: "test",
),
),
);
}
}
class Home extends StatefulWidget {
Home({Key key, this.title}) : super(key: key);
final String title;
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
final CounterBloc counterBloc = BlocProvider.of<CounterBloc>(context);
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: BlocBuilder<CounterBloc, CounterState>(
//cubit: counterBloc,
builder: (context, state) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
state.counter.toString(),
style: Theme.of(context).textTheme.headline4,
),
],
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
print("click");
counterBloc.add(IncrementEvent());
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
this your wrong这是你的错
if (state is IncrementEvent) {
yield CounterState(counter: state.counter + 1);
} else if (state is DecrementEvent) {
yield CounterState(counter: state.counter - 1);
}
change to改成
if (event is IncrementEvent) {
yield CounterState(counter: state.counter + 1);
} else if (event is DecrementEvent) {
yield CounterState(counter: state.counter - 1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.