我对
Flutter/Dart
完全陌生,我正在设计一个应用程序,以便我可以练习。我遇到了一个我在这里没有找到的错误,ChatGPT
都不能给我一个正确的解决方案。
请问这是怎么回事?
main.dart
import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:flutter/material.dart';
import 'package:you_flu/blocs/videos_bloc.dart';
import 'package:you_flu/screens/home.dart';
void main() => runApp(const YouFlu());
class YouFlu extends StatelessWidget {
const YouFlu({super.key});
@override
Widget build(BuildContext context) {
return BlocProvider(
blocs: [VideosBloc()], //Error here
dependencies: const [],
child: const MaterialApp(
debugShowCheckedModeBanner: false,
title: 'YouFlu',
home: Home(),
),
);
}
}
错误指出此处:
blocs: [VideosBloc()],
The element type 'VideosBloc' can't be assigned to the list type 'Bloc<dynamic>'.dartlist_element_type_not_assignable
我已经尝试过:
blocs: VideosBloc(),
带括号和不带括号都是如此。
这是我的
VideosBloc class
import 'dart:ui';
import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:you_flu/api.dart';
import 'dart:async';
import 'package:you_flu/models/video.dart';
class VideosBloc implements BlocBase {
late Api api;
late List<Video> videos;
final StreamController _videosController = StreamController();
Stream get outVideos => _videosController.stream;
final StreamController _searchController = StreamController();
Sink get inSearch => _searchController.sink;
VideosBloc() {
api = Api();
_searchController.stream.listen(_search as void Function(dynamic event)?);
}
void _search(String search) async {
videos = await api.search(search);
}
@override
void dispose() {
_videosController.close();
_searchController.close();
}
@override
void addListener(VoidCallback listener) {}
@override
bool get hasListeners => throw UnimplementedError();
@override
void notifyListeners() {}
@override
void removeListener(VoidCallback listener) {}
}
ChatGPT
告诉我 VideosBloc
类的实现看起来不错。
哦,在我忘记之前:这是我的
pubspec.yaml
,以便你们可以检查我正在使用的版本:
name: you_flu
description: "Youtube Flutter"
publish_to: 'none'
version: 0.1.0
environment:
sdk: '>=3.3.4 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.8
youtube_player_flutter: ^9.0.1
http: ^1.2.1
shared_preferences: ^2.2.3
rxdart: ^0.27.7
bloc_pattern: ^3.0.1
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
flutter:
uses-material-design: true
assets:
- images/
那么,为什么我不能将我的
VideosBloc
类分配给 blocs
上的 BlocProvider
属性?
谢谢!
嗯...我找到了答案,而且非常非常简单:
return BlocProvider(
blocs: [
Bloc((i) => VideosBloc())
],
// other stuff...
),
);
使用方括号创建一个列表,然后使用
function
类中的 Bloc
将我的 VideosBloc
类分配给 Bloc
。