Flutter Bloc 状态无论如何都不会更新

标签 flutter bloc state-management flutter-bloc

我目前正在尝试学习 flutter 的状态管理,我有以下代码,但由于某种原因,状态从未更新过,我是否遗漏了什么?

import 'package:equatable/equatable.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(
      home: BlocProvider(
        create: (context) => ItemBloc(),
        child: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Bloc Demo"),
      ),
      body: Lister(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          ItemBloc().add(AddEvent());
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class Lister extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<ItemBloc, ListState>(
      builder: (context, state) {
        if (state is ListAdded) {
          return ListView.builder(
            itemCount: state.items.length,
            itemBuilder: (context, index) {
              return Text("item"); // This never increases in count
            },
          );
        }
        return Center(
          child: Text('err'),
        );
      },
    );
  }
}

// BLOC
class ItemBloc extends Bloc<ListEvent, ListState> {
  @override
  get initialState => ListAdded(items: ["initial"]);

  @override
  Stream<ListState> mapEventToState(ListEvent event) async* {
    if (event is AddEvent) {
      final lister = ["first", "second"];
      yield ListAdded(items: lister);
    }
  }
}

abstract class ListEvent extends Equatable {
  @override
  List<Object> get props => [];
}

class AddEvent extends ListEvent {}

abstract class ListState extends Equatable {
  const ListState();

  @override
  List<Object> get props => [];
}

class ListAdded extends ListState {
  final List<String> items;

  const ListAdded({
    this.items,
  });

  @override
  List<Object> get props => [items];

  @override
  String toString() => 'ItemsLoaded { items: ${items.length} }';
}

请注意:我已经尝试将代码分成单独的文件,并在 Bloc 文件中导入 bloc.dart 包而不是 flutter_bloc.dart

最佳答案

当你做的时候

ItemBloc().add(AddEvent())

您正在创建新的 bloc 实例并向其添加事件。它与在 MyApp 中创建并在 Lister 中使用的应用程序无关。

您应该获取创建的 bloc:

BlocProvider.of<ItemBloc>(context).add(AddEvent())

关于Flutter Bloc 状态无论如何都不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62072916/

相关文章:

Flutter_bloc : ^8. 0.0 状态在使用不同 Prop 发出相同状态时不会重建

flutter - 使用flutter_bloc时清除文本字段

javascript - 如何在 Redux/React 中处理 UI 状态 - Redux-UI?

sqlite - 如何在SQFlite中插入POJO对象和列表

dart - 断言失败 : 'userRepository != null' : is not true

flutter - 带Cubit的DropDownButton

flutter - Dart 还是 flutter -哪个先出现?

flutter - 将文本包裹在一个圆圈内 (Flutter)

android - 在Android Studio和AppCenter中,Gradle都找不到Flutter构建的APK

flutter - BoxConstraints强制在Flutter中在AlertDialog中使用RadioListTile时引发无限宽度异常