Tôi đã cố gắng nâng cấp ứng dụng Flutter của mình để sử dụng Provider 4.0.1
ngày hôm nay và đoạn mã sau đã bị lỗi khi gán giá trị thành null.
Đây là mã tôi đang cố gắng chuyển đổi. Tôi chỉ thay đổi SingleChildCloneableWidget
để SingleChildStatelessWidget
biên dịch OK.
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
List<SingleChildStatelessWidget> providers = [
...independentServices,
...dependentServices,
...uiConsumableProviders
];
List<SingleChildStatelessWidget> independentServices = [
Provider.value(value: Api()),
Provider.value(value: Tbl()),
Provider.value(value: Bill()),
Provider.value(value: Sale()),
Provider.value(value: Category()),
Provider.value(value: Menu()),
];
List<SingleChildStatelessWidget> dependentServices = [
ProxyProvider<Api, AuthenticationService>(
update: (context, api, authenticationService) => AuthenticationService(api: api),
),
];
List<SingleChildStatelessWidget> uiConsumableProviders = [
StreamProvider<User>(
create: (context) => Provider.of<AuthenticationService>(context, listen: false).user,
),
lazy: false
];
Tôi đã thực hiện nó như thế này:
StreamController<User> _userController = StreamController<User>();
Stream<User> get user => _userController.stream;
Sự cố xảy ra tại đường dây này:
Future<void> _setFixedLanguageStrings(BuildContext context) async {
User _user = Provider.of<User>(context);
_user.homeString = await translate(context, 'Home');
'Ngôn ngữ' getter được gọi là null. Người nhận: null
Điều này đã làm việc tốt với Provider 3.0.3
nhưng rõ ràng tôi cần phải làm nhiều hơn nữa.
Mã ban đầu của tôi đến từ hướng dẫn này .
chỉnh sửa: Tôi đã khắc phục vấn đề đó bằng cách thêm lazy: false
vào phương thức tạo nhà cung cấp luồng nhưng sau đó lại xảy ra lỗi khác trong mã này.
Future<String> translate(BuildContext context, _term) async {
final String _languageCode = Provider.of<User>(context).language;
mà tạo ra lỗi này:
Ngoại lệ đã xảy ra. _AssertsError ('gói: nhà cung cấp / src / nhà cung cấp.dart': Xác nhận thất bại: dòng 213 pos 7: 'bối cảnh.owner.debugBu dựng | bên ngoài cây widget.
Điều này có thể do trình xử lý sự kiện (như onPression của một nút) có tên là Carrier.of mà không vượt qua
listen: false
.Để sửa, hãy viết: Carrier.of (bối cảnh, lắng nghe: sai);
Nó không được hỗ trợ vì có thể xây dựng lại widget một cách vô nghĩa với trình xử lý sự kiện, khi cây widget không quan tâm đến giá trị. )
Tôi đã thêm vào listen: false
dòng trên dường như đã khắc phục vấn đề đó, tuy nhiên nhà cung cấp tiếp theo tôi đã cố sử dụng đã tạo ra lỗi này:
Đã thử nghe một giá trị tiếp xúc với nhà cung cấp, từ bên ngoài cây widget.
Điều này có thể do trình xử lý sự kiện (như onPression của một nút) có tên là Carrier.of mà không vượt qua
listen: false
.Để sửa, hãy viết: Carrier.of (bối cảnh, lắng nghe: sai);
Nó không được hỗ trợ vì có thể xây dựng lại widget một cách vô nghĩa với trình xử lý sự kiện, khi cây widget không quan tâm đến giá trị. 'gói: nhà cung cấp / src / nhà cung cấp.dart': Xác nhận thất bại: dòng 213 pos 7: 'bối cảnh.owner.debugBu dựng | | nghe == sai | | _debugIsInInheritedProviderUpdate '
Bây giờ tôi có nên đi đến mọi trường hợp mà tôi gọi cho một nhà cung cấp và thêm listen: false
không? Tôi cần ai đó giải thích những gì đã thay đổi và tại sao vì tôi khá mới ở Flutter và các tài liệu rất thưa thớt Provider
. Có nhiều lần tôi gọi Nhà cung cấp trong mã của mình và lỗi cuối cùng này không trả về vị trí mã.
Được listen: false
hiện nay luôn luôn cần thiết khi nó không phải là trước hay tôi đã bỏ lỡ cái gì khác? Tôi đang bắt đầu thêm lắng nghe: sai cho mỗi cuộc gọi để khởi tạo biến Nhà cung cấp và nó dường như đang hoạt động nhưng đây có phải là cách tiếp cận đúng không? Tôi có nên thêm listen: false
vào mỗi cuộc gọi Provider.of
và gọi nó một ngày không?
Lỗi chỉ ra rằng ứng dụng đã cố gắng lắng nghe một giá trị bên ngoài cây widget nhưng tôi không nghĩ đó là trường hợp như tôi gọi nó trong phương thức xây dựng widget. Nếu lỗi này là chính xác thì bằng cách nào đó tất cả các nhà cung cấp của tôi đều ở ngoài cây widget. Mã đã hoạt động tốt trong một vài tháng, các lỗi nghe chỉ xuất hiện trên bản cập nhật này.