Функция сборки BlocBuilder не перезагружается - PullRequest
1 голос
/ 24 апреля 2019

В настоящее время я пытаюсь узнать, как работает шаблон блока, но у меня есть некоторые проблемы. Я пытаюсь использовать шаблон BLOC в приложении флаттера, которое является приложением по умолчанию для проекта флаттера. Вот мой основной (верстка) код:

import 'package:flutter/material.dart';
import 'package:suaybtest/my-home-page-state.dart';
import 'my-home-page-bloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final MyHomePageBloc _bloc = MyHomePageBloc();
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: BlocBuilder<MyHomePageEvent, MyHomePageState>(
            bloc: _bloc,
            builder: (context, MyHomePageState state) {
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      'You have pushed the button this many times:',
                    ),
                    Text(
                      '${state.counter}',
                      style: Theme.of(context).textTheme.display1,
                    ),
                  ],
                ),
              );
            }),
        floatingActionButton: Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            FloatingActionButton(
              onPressed: () {
                _bloc.dispatch(MyHomePageEvent.increment);
              },
              tooltip: 'Increment',
              child: Icon(Icons.add),
            ),
            FloatingActionButton(
              onPressed: () {
                _bloc.dispatch(MyHomePageEvent.decrement);
              },
              tooltip: 'Decrement',
              child: Icon(Icons.remove),
            ),
          ],
        ));
  }

  @override
  void dispose() {
    super.dispose();
  }
}

Страница этого блока:

import 'package:bloc/bloc.dart';
import 'package:suaybtest/my-home-page-state.dart';

enum MyHomePageEvent {
  increment,
  decrement,
}

class MyHomePageBloc extends Bloc<MyHomePageEvent, MyHomePageState> {
  @override
  MyHomePageState get initialState => MyHomePageState.initial();

  @override
  Stream<MyHomePageState> mapEventToState(MyHomePageEvent event) async* {
    MyHomePageState state = currentState;
    switch (event) {
      case MyHomePageEvent.increment:
        state.counter++;
        yield state;
        break;
      case MyHomePageEvent.decrement:
        state.counter--;  
        yield state;
        break;
    }
  }
}

и, наконец, вот мое состояние

class MyHomePageState {
  int counter;

  MyHomePageState._();

  factory MyHomePageState.initial(){
    return MyHomePageState._()..counter = 0;
  }
}

Я знаю, что нет необходимости использовать такой класс состояний, потому что у меня есть только одна переменная. Однако это самый близкий пример для приложения реального мира.

Проблема в том, что когда я нажимаю на кнопки, счетчик срабатывания увеличивается, его можно отобразить в режиме отладки, но функция сборки blocbuilder не перезагружается.

Я использую эту библиотеку

dependencies:
  flutter_bloc: ^0.11.1
...