簡體   English   中英

flutter_bloc-如果沒有BlocBuilder,如何獲得價值?

[英]flutter_bloc - how can i get value without BlocBuilder?

我還是流和塊模式的初學者。

我想做以下事情:

  • 觸發事件。
  • 根據事件獲取帶有對象的狀態
  • 將此對象作為JSON存儲在數據庫中。

所有示例都顯示了如何使用BlocBuilder在小部件中顯示對象。 但是我不需要顯示值,只需要獲取並存儲它即可。 我不知道如何將值轉換為變量。

我怎樣才能做到這一點? 在View類中,我正在調度事件,但是現在我需要知道如何在不使用BlocBuilder的情況下使對象返回狀態。

詳細信息如下:

集團

class SchoolBloc extends Bloc<SchoolEvent, SchoolState> {
  final SchoolRepository _schoolRepository;
  StreamSubscription _schoolSubscription;

  SchoolBloc({@required SchoolRepository schoolRepository})
      : assert(schoolRepository != null),
        _schoolRepository = schoolRepository;

  @override
  SchoolState get initialState => SchoolsLoading();

  @override
  Stream<SchoolState> mapEventToState(SchoolEvent event) async* {
    if (event is LoadSchool) {
      yield* _mapLoadSchoolToState();

  Stream<SchoolState> _mapLoadSchoolToState(LoadSchool event) async* {
    _schoolSubscription?.cancel();
    _schoolSubscription = _schoolRepository.school(event.id).listen(
      (school) {
        SchoolLoaded(school);
      }
    );
  }

事件

@immutable
abstract class SchoolEvent extends Equatable {
  SchoolEvent([List props = const []]) : super(props);
}
class LoadSchool extends SchoolEvent {
  final String id;

  LoadSchool(this.id) : super([id]);

  @override
  String toString() => 'LoadSchool';
}

@immutable
abstract class SchoolState extends Equatable {
  SchoolState([List props = const []]) : super(props);
}

class SchoolLoaded extends SchoolState {
  final School school;

  SchoolLoaded([this.school]) : super([school]);

  @override
  String toString() => 'SchoolLoaded { school: $school}';
}

視圖

class CourseView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _CourseViewState();
}

class _CourseViewState extends State<CourseView> {
  @override
  initState() {
    super.initState();
    print("this is my init text");

    final _schoolBloc = BlocProvider.of<SchoolBloc>(context);

    _schoolBloc.dispatch(LoadSchool("3kRHuyk20UggHwm4wrUI"));

    // Here I want to get back the school object and save it to a db
  }

測試失敗

為了進行測試,我做了以下工作:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:teach_mob/core/blocs/school/school.dart';

class CourseView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _CourseViewState();
}

class _CourseViewState extends State<CourseView> {

  @override
  void initState() {
    super.initState();  
        BlocProvider.of<SchoolBloc>(context)
      .dispatch(LoadSchool("3kRHuyk20UggHwm4wrUI"));  
  }

  @override
  Widget build(BuildContext context) {
    return BlocListener<SchoolBloc, SchoolState>(
      listener: (context, state) {
        print("BlocListener is triggered");
      },
      child: Text("This is a test")
    );
  }
}

觸發LoadSchool事件。 將顯示BlocListener的child屬性中的文本,但未執行應顯示“ BlocListener被觸發”的偵聽器功能。

使用BlocListener。 它旨在用於您提到的那些情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM