Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在颤振中使用斩波器网络库和颤振块库_Flutter_Bloc_Flutter Bloc_Chopper - Fatal编程技术网

Flutter 在颤振中使用斩波器网络库和颤振块库

Flutter 在颤振中使用斩波器网络库和颤振块库,flutter,bloc,flutter-bloc,chopper,Flutter,Bloc,Flutter Bloc,Chopper,我正在使用Chopper库为我的业务逻辑调用restapi和flatter_bloc 我的直升机课 import 'package:chopper/chopper.dart'; import '../model/statement_res.dart'; import 'model_converter.dart'; part 'statement_api_service.chopper.dart'; @ChopperApi() abstract class StatementApiServic

我正在使用Chopper库为我的业务逻辑调用restapi和flatter_bloc

我的直升机课

import 'package:chopper/chopper.dart';
import '../model/statement_res.dart';
import 'model_converter.dart';

part 'statement_api_service.chopper.dart';

@ChopperApi()
abstract class StatementApiService extends ChopperService {
  // 6
  @Get(
      path: 'getStatement')
  Future<Response<StatementRes>> getStatement({
    @Query() String AccountNo,
    @Query() String StartDate,
    @Query() String EndDate,
  });

  // 8
  static StatementApiService create() {
    // 9
    final client = ChopperClient(
      // 10
      baseUrl: 'SERVER_URL',
      interceptors: [HttpLoggingInterceptor()],
      converter: ModelConverter(),
      errorConverter: JsonConverter(),
      // 11
      services: [
        _$StatementApiService(),
      ],
    );
    // 12
    return _$StatementApiService(client);
  }

}

事件类别代码:


import 'package:equatable/equatable.dart';

abstract class StatementEvent extends Equatable {
  const StatementEvent();
}

class GetStatement extends StatementEvent {
  final String accountNo;
  final startDate;
  final endDate;

  const GetStatement(this.accountNo, this.startDate, this.endDate);

  @override
  List<Object> get props => [accountNo, startDate, endDate];
}

import 'package:equatable/equatable.dart';
import '../model/statement_res.dart';
import 'package:chopper/chopper.dart';

abstract class StatementState extends Equatable {
  const StatementState();
}

class StatementInitial extends StatementState {
  const StatementInitial();
  @override
  List<Object> get props => [];
}

class StatementLoading extends StatementState {
  const StatementLoading();
  @override
  List<Object> get props => [];
}

class StatementLoaded extends StatementState {
  final Response<StatementRes> statementRes;
  const StatementLoaded(this.statementRes);
  @override
  List<Object> get props => [statementRes];
}

class StatementError extends StatementState {
  final String message;
  const StatementError(this.message);
  @override
  List<Object> get props => [message];
}

国家级代码:


import 'package:equatable/equatable.dart';

abstract class StatementEvent extends Equatable {
  const StatementEvent();
}

class GetStatement extends StatementEvent {
  final String accountNo;
  final startDate;
  final endDate;

  const GetStatement(this.accountNo, this.startDate, this.endDate);

  @override
  List<Object> get props => [accountNo, startDate, endDate];
}

import 'package:equatable/equatable.dart';
import '../model/statement_res.dart';
import 'package:chopper/chopper.dart';

abstract class StatementState extends Equatable {
  const StatementState();
}

class StatementInitial extends StatementState {
  const StatementInitial();
  @override
  List<Object> get props => [];
}

class StatementLoading extends StatementState {
  const StatementLoading();
  @override
  List<Object> get props => [];
}

class StatementLoaded extends StatementState {
  final Response<StatementRes> statementRes;
  const StatementLoaded(this.statementRes);
  @override
  List<Object> get props => [statementRes];
}

class StatementError extends StatementState {
  final String message;
  const StatementError(this.message);
  @override
  List<Object> get props => [message];
}

这是我的BlocmapeventState代码

import 'dart:async';
import 'package:bloc/bloc.dart';
import '../service/statement_api_service.dart';
import './bloc.dart';

class StatementBloc
    extends Bloc<StatementEvent, StatementState> {
  StatementBloc(StatementState initialState) : super(initialState);

  @override
  StatementState get initialState => StatementInitial();

  @override
  Stream<StatementState> mapEventToState(
    StatementEvent event,
  ) async* {
    yield StatementLoading();
    if (event is GetStatement) {
      try {
        final statementResponse =
            await StatementApiService.create()
                .getStatement(
                    AccountNo: event.accountNo,
                    StartDate: event.startDate,
                    EndDate: event.endDate);
        yield StatementLoaded(statementResponse);
      } catch (e) {
        yield StatementError("Failed to fetch Statement");
      }
    }
  }
}

我试图从我的UI调用Bloc的代码,如下所示:

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  StatementBloc stmtBloc;

  @override
  void initState() {
    super.initState();
    stmtBloc = StatementBloc(StatementInitial());
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    stmtBloc.add(
        GetStatement("1155328002", "09-OCT-2020", "19-OCT-2020"));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Testing - Bloc"),
      ),
      body: Container(
        padding: EdgeInsets.symmetric(vertical: 16),
        alignment: Alignment.center,
        child:
          BlocBuilder<StatementBloc, StatementState>(
          builder: (context, state) {
            if (state is StatementLoading) {
              print("#################");
              print("**********StatementLoading*************");
              print("#################");

              return buildLoading();
          } else if (state is StatementLoaded) {
              print("#################");
 ,print("**********StatementLoaded*************");
              print("#################");

              return buildColumnWithData(
                  context, state.sStatementRes.body.responseDesc);
            } else {
              print("#################");
              print("**********Else*************");
              print("#################");

              return buildLoading();
            }
          },
        ),
      ),
    );
  }

}
我能够成功调用API并获得响应。但无法在UI中显示。收到以下例外情况:

flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building Container(center, padding: EdgeInsets(0.0, 16.0, 0.0,
flutter: 16.0)):                                                        
flutter:         BlocProvider.of() called with a context that does not contain a Cubit of type
flutter: StatementBloc.                                     
flutter:         No ancestor could be found starting from the context that was passed to
flutter: BlocProvider.of<StatementBloc>().                  
flutter:                                                                
flutter:         This can happen if the context you used comes from a widget above the BlocProvider.
flutter:                                                                
flutter:         The context used was: BlocBuilder<StatementBloc,
flutter: StatementState>(dirty, state: _BlocBuilderBaseState<StatementBloc,
flutter: StatementState>#4c48e(lifecycle state: created))   
flutter:                                                                
flutter:                                                                
flutter: The relevant error-causing widget was:                         
flutter:   Container                                                    
flutter:   file:/lib/views/my_home_page.dart:50:13

请指导我如何解决上述问题。

我认为最好将“BlocBuilder”作为BlocProvider的子代使用,如下所示:

BlocProvider(
     create: (context) => StatementBloc()..add(Fetch()),
     child: BlocBuilder<StatementBloc, StatementState>(
          builder: (mContext, state) {
               // your code
          }
     ),
),

我希望这能奏效。

谢谢,您的回答帮助我解决了这个问题。