【发布时间】:2020-12-23 10:17:53
【问题描述】:
我有以下问题: 我在 BLoC 架构上制作了一个迷你应用程序。 但我不会更改屏幕上的文字。
我也制作了类似的屏幕并且它们可以正常工作,也许我只是错过了一些东西,但我查看了官方文档,似乎一切都应该正常工作。
Flutter 版本-1.22.5
Bloc 和 Flutter Bloc 版本 - 6.1.0
谁能告诉你问题出在哪里?
这是应用程序代码:
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'bloc/hello_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: Scaffold(body: MyHomePage()),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final HelloBloc helloBloc = HelloBloc();
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => HelloBloc(),
child: BlocBuilder<HelloBloc, HelloState>(builder: (context, state) {
if (state is HelloPrinted) {
return Center(
child: Row(
children: [
Text("Hello"),
TextButton(
onPressed: () {
helloBloc.add(PrintBloc());
},
child: Text("Print Bloc"))
],
),
);
}
if (state is BlocPrinted) {
return Center(
child: Row(
children: [
Text("Bloc"),
TextButton(
onPressed: () {
helloBloc.add(PrintHello());
},
child: Text("Print hello"))
],
),
);
} else {
return Center(
child: Row(
children: [
Text("Start print hello first"),
TextButton(
onPressed: () {
helloBloc.add(PrintHello());
},
child: Text("Print hello"))
],
),
);
}
}),
);
}
}
hello_bloc.dart
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';
part 'hello_event.dart';
part 'hello_state.dart';
class HelloBloc extends Bloc<HelloEvent, HelloState> {
HelloBloc() : super(HelloInitial());
@override
void onTransition(Transition<HelloEvent, HelloState> transition) {
print(transition);
super.onTransition(transition);
}
@override
Stream<HelloState> mapEventToState(
HelloEvent event,
) async* {
if (event is PrintHello) {
await Future<void>.delayed(const Duration(seconds: 1));
yield HelloPrinted();
}
if (event is PrintBloc) {
await Future<void>.delayed(const Duration(seconds: 1));
yield BlocPrinted();
}
}
}
hello_event.dart
part of 'hello_bloc.dart';
@immutable
abstract class HelloEvent {}
class PrintHello extends HelloEvent {}
class PrintBloc extends HelloEvent {}
hello_state.dart
part of 'hello_bloc.dart';
@immutable
abstract class HelloState {}
class HelloInitial extends HelloState {}
class HelloPrinted extends HelloState {}
class BlocPrinted extends HelloState {}
提前感谢大家的回答。
【问题讨论】:
-
我认为问题在于,如果您在 blocBuilder 中自己提供 bloc,则必须将其传递给参数。在旧版本中它是
bloc:,在新版本中你必须使用cubit:。参考:pub.dev/documentation/flutter_bloc/latest/flutter_bloc/… -
我加了cubit,但是还没用,谢谢回复