import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../services/api_service.dart'; import '../providers/app_provider.dart'; import '../models/problem.dart'; /// 题目预览 Widget — WebView 渲染服务端 HTML+MathML(Android) class ProblemPreview extends ConsumerStatefulWidget { final Problem problem; final bool showAnswer; const ProblemPreview({super.key, required this.problem, this.showAnswer = true}); @override ConsumerState createState() => _ProblemPreviewState(); } class _ProblemPreviewState extends ConsumerState { WebViewController? _controller; @override void initState() { super.initState(); _initController(); } @override void didUpdateWidget(ProblemPreview oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.problem.id != widget.problem.id || oldWidget.showAnswer != widget.showAnswer) { _initController(); } } void _initController() { _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted); _loadContent(); } Future _loadContent() async { final api = ref.read(apiServiceProvider); final baseUrl = api.baseUrl ?? ''; final token = api.token ?? ''; final answerParam = widget.showAnswer ? 'true' : 'false'; final viewUrl = '$baseUrl/api/problems/${widget.problem.id}/view' '?include_answer=$answerParam&token=$token'; _controller?.loadRequest(Uri.parse(viewUrl)); } @override Widget build(BuildContext context) { if (_controller == null) { return const Center(child: CircularProgressIndicator()); } return WebViewWidget(controller: _controller!); } }